xref: /template/mikio/mikio.php (revision 34d5f19a7c6e8434b6a1d63ab86a60d1b895282c)
1c165b184SJames Collins<?php
210b40067Snomadjimbob
3c165b184SJames Collins/**
4c165b184SJames Collins * DokuWiki Mikio Template
5c165b184SJames Collins *
6c165b184SJames Collins * @link    http://dokuwiki.org/template:mikio
7c165b184SJames Collins * @author  James Collins <james.collins@outlook.com.au>
8ab45ba71SJames Collins * @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html)
9c165b184SJames Collins */
1010b40067Snomadjimbob
11ab45ba71SJames Collinsnamespace dokuwiki\template\mikio;
12c165b184SJames Collins
139cff245bSJames Collinsif (defined('DOKU_INC') === false) {
149cff245bSJames Collins    die();
159cff245bSJames Collins}
16c165b184SJames Collins
17ab45ba71SJames Collinsrequire_once('icons/icons.php');
18c165b184SJames Collinsrequire_once('inc/simple_html_dom.php');
19c165b184SJames Collins
2010b40067Snomadjimbobclass Template
2110b40067Snomadjimbob{
229cff245bSJames Collins    /**
239cff245bSJames Collins     * @var string Template directory path from local FS.
249cff245bSJames Collins     */
25c165b184SJames Collins    public $tplDir  = '';
269cff245bSJames Collins
279cff245bSJames Collins    /**
289cff245bSJames Collins     * @var string Template directory path from web.
299cff245bSJames Collins     */
30c165b184SJames Collins    public $baseDir = '';
319cff245bSJames Collins
329cff245bSJames Collins    /**
339cff245bSJames Collins     * @var array Array of Javascript files to include in footer.
349cff245bSJames Collins     */
359cff245bSJames Collins    public $footerScript = [];
369cff245bSJames Collins
379cff245bSJames Collins    /**
389cff245bSJames Collins     * @var boolean Ignore LESS files.
399cff245bSJames Collins     */
40a8df40efSJames Collins    public $lessIgnored = false;
41c165b184SJames Collins
42c165b184SJames Collins
43c165b184SJames Collins    /**
44c165b184SJames Collins     * Class constructor
45c165b184SJames Collins     */
4610b40067Snomadjimbob    public function __construct()
4710b40067Snomadjimbob    {
48c165b184SJames Collins        $this->tplDir  = tpl_incdir();
49c165b184SJames Collins        $this->baseDir = tpl_basedir();
50c165b184SJames Collins
519cff245bSJames Collins        $this->registerHooks();
52c165b184SJames Collins    }
53c165b184SJames Collins
54c165b184SJames Collins    /**
55ab45ba71SJames Collins     * Returns the instance of the class
5647161538SJames Collins     *
57ab45ba71SJames Collins     * @return  Template        class instance
5847161538SJames Collins     */
5947161538SJames Collins    public static function getInstance()
6047161538SJames Collins    {
6147161538SJames Collins        static $instance = null;
6247161538SJames Collins
633a385f2cSJames Collins        if (empty($instance) === true) {
6447161538SJames Collins            $instance = new Template();
6547161538SJames Collins        }
6647161538SJames Collins
6747161538SJames Collins        return $instance;
6847161538SJames Collins    }
6947161538SJames Collins
70ab45ba71SJames Collins
7147161538SJames Collins    /**
72ab45ba71SJames Collins     * Register the themes hooks into Dokuwiki
739cff245bSJames Collins     *
749cff245bSJames Collins     * @return void
75c165b184SJames Collins     */
769cff245bSJames Collins    private function registerHooks()
7710b40067Snomadjimbob    {
78c165b184SJames Collins        global $EVENT_HANDLER;
79c165b184SJames Collins
809cff245bSJames Collins        $events_dispatcher = [
81ab45ba71SJames Collins            'TPL_METAHEADER_OUTPUT'     => 'metaheadersHandler'
829cff245bSJames Collins        ];
83c165b184SJames Collins
84c165b184SJames Collins        foreach ($events_dispatcher as $event => $method) {
85c165b184SJames Collins            $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method);
86c165b184SJames Collins        }
87c165b184SJames Collins    }
88c165b184SJames Collins
89c165b184SJames Collins
90c165b184SJames Collins    /**
91ab45ba71SJames Collins     * Meta handler hook for DokuWiki
92c165b184SJames Collins     *
939cff245bSJames Collins     * @param   \Doku_Event $event DokuWiki Event.
949cff245bSJames Collins     * @return  void
95c165b184SJames Collins     */
9610b40067Snomadjimbob    public function metaHeadersHandler(\Doku_Event $event)
9710b40067Snomadjimbob    {
98ab45ba71SJames Collins        global $MIKIO_ICONS;
99b5536b07SChris MacMackin        global $conf;
100ab45ba71SJames Collins
101ad182e6dSnomadjimbob        global $MIKIO_TEMPLATE;
102ad182e6dSnomadjimbob        $MIKIO_TEMPLATE = '123';
103ad182e6dSnomadjimbob
1049cff245bSJames Collins        $this->includePage('theme', false, true);
105a8eebd82SJames Collins
1069cff245bSJames Collins        $stylesheets    = [];
1079cff245bSJames Collins        $scripts        = [];
108c165b184SJames Collins
1093a385f2cSJames Collins        if (empty($this->getConf('customTheme')) === false) {
1109cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) {
111a8eebd82SJames Collins                $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less';
112a8eebd82SJames Collins            } else {
1139cff245bSJames Collins                if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) {
114ab45ba71SJames Collins                    $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css';
1152b4583abSJames Collins                }
116a8eebd82SJames Collins            }
1179cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) {
118ab45ba71SJames Collins                $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js';
119c165b184SJames Collins            }
120c165b184SJames Collins        }
121c165b184SJames Collins
1223a385f2cSJames Collins        if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) {
1239cff245bSJames Collins            $icons = [];
124ab45ba71SJames Collins            foreach ($MIKIO_ICONS as $icon) {
1259cff245bSJames Collins                if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) {
126ab45ba71SJames Collins                    $icons[] = $icon;
127c165b184SJames Collins
1283a385f2cSJames Collins                    if (empty($icon['css']) === false) {
1299cff245bSJames Collins                        if (strpos($icon['css'], '//') === false) {
130a8eebd82SJames Collins                            $stylesheets[] = $this->baseDir . 'icons/' . $icon['css'];
131ab45ba71SJames Collins                        } else {
132a8eebd82SJames Collins                            $stylesheets[] = $icon['css'];
133ab45ba71SJames Collins                        }
134ab45ba71SJames Collins                    }
135ab45ba71SJames Collins                }
136ab45ba71SJames Collins            }
137ab45ba71SJames Collins            $MIKIO_ICONS = $icons;
138ab45ba71SJames Collins        } else {
139ab45ba71SJames Collins            $MIKIO_ICONS = [];
140ab45ba71SJames Collins        }
141c165b184SJames Collins
1427864545bSChris MacMackin        $scripts[] = $this->baseDir . 'assets/mikio-typeahead.js';
143ab45ba71SJames Collins        $scripts[] = $this->baseDir . 'assets/mikio.js';
144644fd9f9SJames Collins
1459cff245bSJames Collins        if ($this->getConf('useLESS') === true) {
146ab45ba71SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.less';
147644fd9f9SJames Collins        } else {
148644fd9f9SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.css';
149644fd9f9SJames Collins        }
150644fd9f9SJames Collins
151ad182e6dSnomadjimbob        /* MikioPlugin Support */
1529ffe9161Snomadjimbob        if (plugin_load('action', 'mikioplugin') !== null) {
153ad182e6dSnomadjimbob            if ($this->getConf('useLESS') === true) {
154ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.less';
155ad182e6dSnomadjimbob            } else {
156ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.css';
157ad182e6dSnomadjimbob            }
158ad182e6dSnomadjimbob        }
159ab45ba71SJames Collins
160ab45ba71SJames Collins        $set = [];
161c165b184SJames Collins        foreach ($stylesheets as $style) {
1629cff245bSJames Collins            if (in_array($style, $set) === false) {
1633a385f2cSJames Collins                if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) {
164ab45ba71SJames Collins                    $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style);
165ab45ba71SJames Collins                }
166ab45ba71SJames Collins
1679cff245bSJames Collins                array_unshift($event->data['link'], [
168c165b184SJames Collins                    'type' => 'text/css',
169c165b184SJames Collins                    'rel'  => 'stylesheet',
170c165b184SJames Collins                    'href' => $style
1719cff245bSJames Collins                ]);
172c165b184SJames Collins            }
173ab45ba71SJames Collins            $set[] = $style;
174ab45ba71SJames Collins        }
175c165b184SJames Collins
176ab45ba71SJames Collins        $set = [];
177c165b184SJames Collins        foreach ($scripts as $script) {
1789cff245bSJames Collins            if (in_array($script, $set) === false) {
1799cff245bSJames Collins                $script_params = [
180c165b184SJames Collins                    'type'  => 'text/javascript',
181c165b184SJames Collins                    '_data' => '',
1828395cdcbSChris MacMackin                    'src'   => $script
1839cff245bSJames Collins                ];
184c1ecb866SJames Collins
185c1ecb866SJames Collins                // equal to or greator than hogfather
186c1ecb866SJames Collins                if ($this->dwVersionNumber() >= 20200729) {
187c1ecb866SJames Collins                    // greator than hogfather - defer always on
188c1ecb866SJames Collins                    if ($this->dwVersionNumber() >= 20200729) {
189c1ecb866SJames Collins                        $script_params += ['defer' => 'defer'];
190c1ecb866SJames Collins                    } else {
191c1ecb866SJames Collins                        // hogfather - defer always on unless $conf['defer_js'] is false
1929cff245bSJames Collins                        if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) {
1938395cdcbSChris MacMackin                            $script_params += ['defer' => 'defer'];
1948395cdcbSChris MacMackin                        }
195c1ecb866SJames Collins                    }
196c1ecb866SJames Collins                }
197c1ecb866SJames Collins
1988395cdcbSChris MacMackin                $event->data['script'][] = $script_params;
1999cff245bSJames Collins            }//end if
200ab45ba71SJames Collins            $set[] = $script;
2019cff245bSJames Collins        }//end foreach
202c165b184SJames Collins    }
203c165b184SJames Collins
204c165b184SJames Collins
205c165b184SJames Collins    /**
206a8eebd82SJames Collins     * Print or return the footer meta data
207c165b184SJames Collins     *
2089cff245bSJames Collins     * @param   boolean $print Print the data to buffer.
2099cff245bSJames Collins     * @return  string         HTML footer meta data
210c165b184SJames Collins     */
2119cff245bSJames Collins    public function includeFooterMeta(bool $print = true)
21210b40067Snomadjimbob    {
213a8eebd82SJames Collins        $html = '';
214a8eebd82SJames Collins
215a8eebd82SJames Collins        if (count($this->footerScript) > 0) {
216a8eebd82SJames Collins            $html .= '<script type="text/javascript">function mikioFooterRun() {';
217a8eebd82SJames Collins            foreach ($this->footerScript as $script) {
218a8eebd82SJames Collins                $html .= $script . ';';
219a8eebd82SJames Collins            }
220a8eebd82SJames Collins            $html .= '}</script>';
221a8eebd82SJames Collins        }
222c165b184SJames Collins
223c165b184SJames Collins
2249cff245bSJames Collins        if ($print === true) {
2259cff245bSJames Collins            echo $html;
2269cff245bSJames Collins        }
227a8eebd82SJames Collins        return $html;
228a8eebd82SJames Collins    }
229a8eebd82SJames Collins
23095372bffSJames Collins
23195372bffSJames Collins    // phpcs:disable Squiz.Commenting.FunctionComment.TypeHintMissing
23295372bffSJames Collins
23395372bffSJames Collins
234a8eebd82SJames Collins    /**
235ab45ba71SJames Collins     * Retreive and parse theme configuration options
236c165b184SJames Collins     *
2379cff245bSJames Collins     * @param   string $key     The configuration key to retreive.
2389cff245bSJames Collins     * @param   mixed  $default If key doesn't exist, return this value.
239ab45ba71SJames Collins     * @return  mixed           parsed value of configuration
240c165b184SJames Collins     */
24195372bffSJames Collins    public function getConf(string $key, $default = false)
24210b40067Snomadjimbob    {
243c165b184SJames Collins        $value = tpl_getConf($key, $default);
244c165b184SJames Collins
2453a385f2cSJames Collins        $data = [
2463a385f2cSJames Collins            ['keys' => ['navbarDWMenuType'],                'type' => 'choice',
2473a385f2cSJames Collins                'values' => ['both', 'icons', 'text']
2483a385f2cSJames Collins            ],
2493a385f2cSJames Collins            ['keys' => ['navbarDWMenuCombine'],             'type' => 'choice',
2503a385f2cSJames Collins                'values' => ['combine', 'seperate', 'dropdown']
2513a385f2cSJames Collins            ],
2523a385f2cSJames Collins            ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'],
2533a385f2cSJames Collins                'type' => 'choice',
2543a385f2cSJames Collins                'values' => ['none', 'custom', 'search', 'dokuwiki'],
2553a385f2cSJames Collins                'default' => [
2563a385f2cSJames Collins                    'navbarPosLeft' => 'none',
2573a385f2cSJames Collins                    'navbarPosMiddle' => 'search',
2583a385f2cSJames Collins                    'navbarPosRight' => 'dokuwiki'
2593a385f2cSJames Collins                ]
2603a385f2cSJames Collins            ],
2613a385f2cSJames Collins            ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink',
2623a385f2cSJames Collins                'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile',
2633a385f2cSJames Collins                'navbarItemShowAdmin'
2643a385f2cSJames Collins            ],
2653a385f2cSJames Collins                'type' => 'choice',
2663a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
2673a385f2cSJames Collins            ],
2683a385f2cSJames Collins            ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'],
2693a385f2cSJames Collins                'type' => 'choice',
2703a385f2cSJames Collins                'values' => ['always', 'never']
2713a385f2cSJames Collins            ],
2723a385f2cSJames Collins            ['keys' => ['searchButton'],                    'type' => 'choice',
2733a385f2cSJames Collins                'values' => ['icon', 'text']
2743a385f2cSJames Collins            ],
2753a385f2cSJames Collins            ['keys' => ['breadcrumbPosition', 'youareherePosition'],
2763a385f2cSJames Collins                'type' => 'choice',
2773a385f2cSJames Collins                'values' => ['top', 'hero', 'page', 'none']
2783a385f2cSJames Collins            ],
2793a385f2cSJames Collins            ['keys' => ['youarehereHome'],                  'type' => 'choice',
2803a385f2cSJames Collins                'values' => ['page title', 'home', 'icon', 'none']
2813a385f2cSJames Collins            ],
2823a385f2cSJames Collins            ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'],
2833a385f2cSJames Collins                'type' => 'choice',
2843a385f2cSJames Collins                'values' => ['none', 'logged in user', 'search', 'content', 'tags'],
2853a385f2cSJames Collins                'default' => [
2863a385f2cSJames Collins                    'sidebarLeftRow1' => 'logged in user',
2873a385f2cSJames Collins                    'sidebarLeftRow2' => 'search',
2883a385f2cSJames Collins                    'sidebarLeftRow3' => 'content'
2893a385f2cSJames Collins                ]
2903a385f2cSJames Collins            ],
2913a385f2cSJames Collins            ['keys' => ['pageToolsFloating', 'pageToolsFooter'],
2923a385f2cSJames Collins                'type' => 'choice',
2933a385f2cSJames Collins                'values' => ['always', 'none', 'page editors']
2943a385f2cSJames Collins            ],
2953a385f2cSJames Collins            ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink',
2963a385f2cSJames Collins                'pageToolsShowTop'
2973a385f2cSJames Collins            ],
2983a385f2cSJames Collins                'type' => 'choice',
2993a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
3003a385f2cSJames Collins            ],
3013a385f2cSJames Collins            ['keys' => ['showNotifications'],               'type' => 'choice',
3023a385f2cSJames Collins                'values' => ['admin', 'always', 'none']
3033a385f2cSJames Collins            ],
3043a385f2cSJames Collins            ['keys' => ['licenseType'],                     'type' => 'choice',
3053a385f2cSJames Collins                'values' => ['badge', 'button', 'none']
3063a385f2cSJames Collins            ],
3073a385f2cSJames Collins            ['keys' => ['navbarUseTitleIcon'],              'type' => 'bool'],
3083a385f2cSJames Collins            ['keys' => ['navbarUseTitleText'],              'type' => 'bool'],
3093a385f2cSJames Collins            ['keys' => ['navbarUseTaglineText'],            'type' => 'bool'],
3103a385f2cSJames Collins            ['keys' => ['navbarShowSub'],                   'type' => 'bool'],
3113a385f2cSJames Collins            ['keys' => ['heroTitle'],                       'type' => 'bool'],
3123a385f2cSJames Collins            ['keys' => ['heroImagePropagation'],            'type' => 'bool'],
3133a385f2cSJames Collins            ['keys' => ['breadcrumbPrefix'],                'type' => 'bool'],
3143a385f2cSJames Collins            ['keys' => ['breadcrumbSep'],                   'type' => 'bool'],
3153a385f2cSJames Collins            ['keys' => ['youareherePrefix'],                'type' => 'bool'],
3163a385f2cSJames Collins            ['keys' => ['youarehereSep'],                   'type' => 'bool'],
3173a385f2cSJames Collins            ['keys' => ['sidebarShowLeft'],                 'type' => 'bool'],
3183a385f2cSJames Collins            ['keys' => ['sidebarShowRight'],                'type' => 'bool'],
3193a385f2cSJames Collins            ['keys' => ['tocFull'],                         'type' => 'bool'],
3203a385f2cSJames Collins            ['keys' => ['footerSearch'],                    'type' => 'bool'],
3213a385f2cSJames Collins            ['keys' => ['licenseImageOnly'],                'type' => 'bool'],
3223a385f2cSJames Collins            ['keys' => ['includePageUseACL'],               'type' => 'bool'],
3233a385f2cSJames Collins            ['keys' => ['includePagePropagate'],            'type' => 'bool'],
3243a385f2cSJames Collins            ['keys' => ['youarehereHideHome'],              'type' => 'bool'],
3253a385f2cSJames Collins            ['keys' => ['tagsConsolidate'],                 'type' => 'bool'],
3263a385f2cSJames Collins            ['keys' => ['footerInPage'],                    'type' => 'bool'],
3273a385f2cSJames Collins            ['keys' => ['sidebarMobileDefaultCollapse'],    'type' => 'bool'],
3283a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowLeft'],           'type' => 'bool'],
3293a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowRight'],          'type' => 'bool'],
3303a385f2cSJames Collins            ['keys' => ['searchUseTypeahead'],              'type' => 'bool'],
33112030b10SJames Collins            ['keys' => ['showLightDark'],                   'type' => 'bool'],
332*34d5f19aSJames Collins            ['keys' => ['autoLightDark'],                   'type' => 'bool'],
3333a385f2cSJames Collins            ['keys' => ['youarehereShowLast'],              'type' => 'int'],
3343a385f2cSJames Collins
3353a385f2cSJames Collins            ['keys' => ['iconTag'],                         'type' => 'string'],
3363a385f2cSJames Collins            ['keys' => ['customTheme'],                     'type' => 'string'],
3373a385f2cSJames Collins            ['keys' => ['navbarCustomMenuText'],            'type' => 'string'],
3383a385f2cSJames Collins            ['keys' => ['breadcrumbPrefixText'],            'type' => 'string'],
3393a385f2cSJames Collins            ['keys' => ['breadcrumbSepText'],               'type' => 'string'],
3403a385f2cSJames Collins            ['keys' => ['youareherePrefixText'],            'type' => 'string'],
3413a385f2cSJames Collins            ['keys' => ['youarehereSepText'],               'type' => 'string'],
3423a385f2cSJames Collins            ['keys' => ['footerCustomMenuText'],            'type' => 'string'],
3433a385f2cSJames Collins            ['keys' => ['brandURLGuest'],                   'type' => 'string'],
3443a385f2cSJames Collins            ['keys' => ['brandURLUser'],                    'type' => 'string'],
3453a385f2cSJames Collins
3463a385f2cSJames Collins            ['keys' => ['useLESS'],                         'type' => 'less'],
3473a385f2cSJames Collins        ];
3483a385f2cSJames Collins
3493a385f2cSJames Collins        foreach ($data as $row) {
3503a385f2cSJames Collins            // does not check case....
3513a385f2cSJames Collins            if (in_array($key, $row['keys']) === true) {
35295372bffSJames Collins                if (array_key_exists('type', $row) === true) {
3533a385f2cSJames Collins                    switch ($row['type']) {
3543a385f2cSJames Collins                        case 'bool':
3553a385f2cSJames Collins                            return (bool) $value;
3563a385f2cSJames Collins                        case 'int':
3573a385f2cSJames Collins                            return (int) $value;
3583a385f2cSJames Collins                        case 'string':
3593a385f2cSJames Collins                            return $value;
3603a385f2cSJames Collins                        case 'less':
36129118ed7SJames Collins                            $value = (bool) $value;
362a8df40efSJames Collins                            $lessAvailable = true;
363a8df40efSJames Collins
364a8df40efSJames Collins                            // check for less library
365a8df40efSJames Collins                            $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php';
3669cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
367a8df40efSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3689cff245bSJames Collins                            }
3699cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
370a8df40efSJames Collins                                $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3719cff245bSJames Collins                            }
3729cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
3739cff245bSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] .
3749cff245bSJames Collins                                    '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3759cff245bSJames Collins                            }
3769cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
377a8df40efSJames Collins                                $lessAvailable = false;
378a8df40efSJames Collins                            }
379a8df40efSJames Collins
380a8df40efSJames Collins                            // check for ctype extensions
3819cff245bSJames Collins                            if (function_exists('ctype_digit') === false) {
382a8df40efSJames Collins                                $lessAvailable = false;
383a8df40efSJames Collins                            }
384a8df40efSJames Collins
3859cff245bSJames Collins                            if ($value === true && $lessAvailable === false) {
386a8df40efSJames Collins                                $this->lessIgnored = true;
38729118ed7SJames Collins                                $value = false;
38829118ed7SJames Collins                            }
3893a385f2cSJames Collins
3903a385f2cSJames Collins                            return $value;
3919cff245bSJames Collins                    }//end switch
3923a385f2cSJames Collins                }//end if
3933a385f2cSJames Collins
3943a385f2cSJames Collins                if (in_array($value, $row['values']) === true) {
3953a385f2cSJames Collins                    return $value;
3963a385f2cSJames Collins                }
3973a385f2cSJames Collins
3983a385f2cSJames Collins                if (array_key_exists('default', $row) === true) {
3993a385f2cSJames Collins                    if (is_array($row['default']) === true) {
4003a385f2cSJames Collins                        if (array_key_exists($key, $row['default']) === true) {
4013a385f2cSJames Collins                            return $row['default'][$key];
4023a385f2cSJames Collins                        }
4033a385f2cSJames Collins                    } else {
4043a385f2cSJames Collins                        return $row['default'];
4053a385f2cSJames Collins                    }
4063a385f2cSJames Collins                }
4073a385f2cSJames Collins
4083a385f2cSJames Collins                return reset($row['values']);
4093a385f2cSJames Collins            }//end if
4103a385f2cSJames Collins        }//end foreach
411c165b184SJames Collins
412c165b184SJames Collins        return $value;
413c165b184SJames Collins    }
414c165b184SJames Collins
415c165b184SJames Collins
41695372bffSJames Collins    // phpcs:enable
41795372bffSJames Collins
41895372bffSJames Collins
419c165b184SJames Collins    /**
420a8eebd82SJames Collins     * Check if a page exist in directory or namespace
421c165b184SJames Collins     *
4229cff245bSJames Collins     * @param   string $page Page/namespace to search.
423a8eebd82SJames Collins     * @return  boolean      if page exists
424c165b184SJames Collins     */
4259cff245bSJames Collins    public function pageExists(string $page)
42610b40067Snomadjimbob    {
427ab45ba71SJames Collins        ob_start();
428a8eebd82SJames Collins        tpl_includeFile($page . '.html');
429ab45ba71SJames Collins        $html = ob_get_contents();
430ab45ba71SJames Collins        ob_end_clean();
431a8eebd82SJames Collins
4323a385f2cSJames Collins        if (empty($html) === false) {
4339cff245bSJames Collins            return true;
4349cff245bSJames Collins        }
435a8eebd82SJames Collins
436a8eebd82SJames Collins        $useACL = $this->getConf('includePageUseACL');
437a8eebd82SJames Collins        $propagate = $this->getConf('includePagePropagate');
438a8eebd82SJames Collins
4399cff245bSJames Collins        if ($propagate === true) {
4409cff245bSJames Collins            if (page_findnearest($page, $useACL) !== false) {
4419cff245bSJames Collins                return true;
4429cff245bSJames Collins            }
4439cff245bSJames Collins        } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) {
4449cff245bSJames Collins            return true;
445ab45ba71SJames Collins        }
446ab45ba71SJames Collins
4479cff245bSJames Collins        return false;
448ab45ba71SJames Collins    }
449ab45ba71SJames Collins
450a8eebd82SJames Collins
451c165b184SJames Collins    /**
452a8eebd82SJames Collins     * Print or return page from directory or namespace
4532b4583abSJames Collins     *
4549cff245bSJames Collins     * @param   string  $page         Page/namespace to include.
4559cff245bSJames Collins     * @param   boolean $print        Print content.
4569cff245bSJames Collins     * @param   boolean $parse        Parse content before printing/returning.
4579cff245bSJames Collins     * @param   string  $classWrapper Wrap page in a div with class.
458ab45ba71SJames Collins     * @return  string                contents of page found
4592b4583abSJames Collins     */
4609cff245bSJames Collins    public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '')
4612b4583abSJames Collins    {
462a8eebd82SJames Collins        ob_start();
463a8eebd82SJames Collins        tpl_includeFile($page . '.html');
464a8eebd82SJames Collins        $html = ob_get_contents();
465a8eebd82SJames Collins        ob_end_clean();
466a8eebd82SJames Collins
4673a385f2cSJames Collins        if (empty($html) === true) {
468a8eebd82SJames Collins            $useACL = $this->getConf('includePageUseACL');
469a8eebd82SJames Collins            $propagate = $this->getConf('includePagePropagate');
470ab45ba71SJames Collins            $html = '';
4712b4583abSJames Collins
472ab45ba71SJames Collins            $html = tpl_include_page($page, false, $propagate, $useACL);
473ab45ba71SJames Collins        }
4742b4583abSJames Collins
4753a385f2cSJames Collins        if (empty($html) === false && $parse === true) {
476ab45ba71SJames Collins            $html = $this->parseContent($html);
477ab45ba71SJames Collins        }
4782b4583abSJames Collins
4793a385f2cSJames Collins        if (empty($classWrapper) === false && empty($html) === false) {
4809cff245bSJames Collins            $html = '<div class="' . $classWrapper . '">' . $html . '</div>';
4819cff245bSJames Collins        }
4822b4583abSJames Collins
4839cff245bSJames Collins        if ($print === true) {
4849cff245bSJames Collins            echo $html;
4859cff245bSJames Collins        }
486ab45ba71SJames Collins        return $html;
4872b4583abSJames Collins    }
4882b4583abSJames Collins
489a8eebd82SJames Collins
490a8eebd82SJames Collins    /**
491a8eebd82SJames Collins     * Print or return logged in user information
492a8eebd82SJames Collins     *
4939cff245bSJames Collins     * @param   boolean $print Print content.
494a8eebd82SJames Collins     * @return  string         user information
495a8eebd82SJames Collins     */
4969cff245bSJames Collins    public function includeLoggedIn(bool $print = true)
49710b40067Snomadjimbob    {
498a8eebd82SJames Collins        $html = '';
499a8eebd82SJames Collins
5009cff245bSJames Collins        if (empty($_SERVER['REMOTE_USER']) === false) {
501a8eebd82SJames Collins            $html .= '<div class="mikio-user-info">';
502a8eebd82SJames Collins            ob_start();
503a8eebd82SJames Collins            tpl_userinfo();
504a8eebd82SJames Collins            $html .= ob_get_contents();
505a8eebd82SJames Collins            ob_end_clean();
506a8eebd82SJames Collins            $html .= '</div>';
5072b4583abSJames Collins        }
508a8eebd82SJames Collins
5099cff245bSJames Collins        if ($print === true) {
5109cff245bSJames Collins            echo $html;
5119cff245bSJames Collins        }
512a8eebd82SJames Collins        return $html;
5132b4583abSJames Collins    }
5142b4583abSJames Collins
5152b4583abSJames Collins
516a8eebd82SJames Collins    /**
517a8eebd82SJames Collins     * Print or return DokuWiki Menu
518a8eebd82SJames Collins     *
5199cff245bSJames Collins     * @param   boolean $print Print content.
520a8eebd82SJames Collins     * @return  string         contents of the menu
521a8eebd82SJames Collins     */
5229cff245bSJames Collins    public function includeDWMenu(bool $print = true)
52310b40067Snomadjimbob    {
5242b4583abSJames Collins        global $lang;
5252b4583abSJames Collins        global $USERINFO;
526c165b184SJames Collins
5279cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
528a8eebd82SJames Collins        $html = '<ul class="mikio-nav">';
5292b4583abSJames Collins
530ab45ba71SJames Collins        $pageToolsMenu = [];
531ab45ba71SJames Collins        $siteToolsMenu = [];
532ab45ba71SJames Collins        $userToolsMenu = [];
533c165b184SJames Collins
534ab45ba71SJames Collins        $showIcons  = ($this->getConf('navbarDWMenuType') != 'text');
535ab45ba71SJames Collins        $showText   = ($this->getConf('navbarDWMenuType') != 'icons');
536ab45ba71SJames Collins        $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate');
5372b4583abSJames Collins
5382b4583abSJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
5392b4583abSJames Collins        foreach ($items as $item) {
5409cff245bSJames Collins            if ($item->getType() !== 'top') {
541ab45ba71SJames Collins                $itemHtml = '';
5422b4583abSJames Collins
543905b27c6SJames Collins                $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5449cff245bSJames Collins                if (
5453a385f2cSJames Collins                    $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5463a385f2cSJames Collins                    (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5473a385f2cSJames Collins                    (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5489cff245bSJames Collins                ) {
5499cff245bSJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') .
5509cff245bSJames Collins                        ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5519cff245bSJames Collins                    if ($showIcons === true) {
5529cff245bSJames Collins                        $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5539cff245bSJames Collins                    }
5549cff245bSJames Collins                    if ($showText === true || $isDropDown === true) {
5559cff245bSJames Collins                        $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5569cff245bSJames Collins                    }
557ab45ba71SJames Collins                    $itemHtml .= '</a>';
558ab45ba71SJames Collins
559ab45ba71SJames Collins                    $pageToolsMenu[] = $itemHtml;
5602b4583abSJames Collins                }
5619cff245bSJames Collins            }//end if
5629cff245bSJames Collins        }//end foreach
5632b4583abSJames Collins
564ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action');
565ab45ba71SJames Collins        foreach ($items as $item) {
566ab45ba71SJames Collins            $itemHtml = '';
5672b4583abSJames Collins
568905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5699cff245bSJames Collins            if (
5703a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5713a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5723a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5739cff245bSJames Collins            ) {
5749cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' .
5759cff245bSJames Collins                    $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5769cff245bSJames Collins                if ($showIcons === true) {
5779cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5789cff245bSJames Collins                }
5799cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
5809cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5819cff245bSJames Collins                }
582ab45ba71SJames Collins                $itemHtml .= '</a>';
5832b4583abSJames Collins
584ab45ba71SJames Collins                $siteToolsMenu[] = $itemHtml;
5852b4583abSJames Collins            }
5869cff245bSJames Collins        }//end foreach
5872b4583abSJames Collins
588ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\UserMenu())->getItems('action');
589ab45ba71SJames Collins        foreach ($items as $item) {
590ab45ba71SJames Collins            $itemHtml = '';
591ab45ba71SJames Collins
592905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5939cff245bSJames Collins            if (
5943a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5953a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5963a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5979cff245bSJames Collins            ) {
5989cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' .
5999cff245bSJames Collins                $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
6009cff245bSJames Collins                if ($showIcons === true) {
6019cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
6029cff245bSJames Collins                }
6039cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
6049cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
6059cff245bSJames Collins                }
606ab45ba71SJames Collins                $itemHtml .= '</a>';
607ab45ba71SJames Collins
608ab45ba71SJames Collins                $userToolsMenu[] = $itemHtml;
609ab45ba71SJames Collins            }
6109cff245bSJames Collins        }//end foreach
611ab45ba71SJames Collins
612ab45ba71SJames Collins
613ab45ba71SJames Collins        switch ($this->getConf('navbarDWMenuCombine')) {
614ab45ba71SJames Collins            case 'dropdown':
615ab45ba71SJames Collins                $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">';
6169cff245bSJames Collins                $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button"
6179cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6189cff245bSJames Collins                ($showIcons === true ? $this->mikioInlineIcon('file') : '') .
6199cff245bSJames Collins                ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] .
6209cff245bSJames Collins                '</span>') . '</a>';
621a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
622ab45ba71SJames Collins
623ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
624ab45ba71SJames Collins                    $html .= $item;
625ab45ba71SJames Collins                }
626ab45ba71SJames Collins
627ab45ba71SJames Collins                $html .= '</div>';
628ab45ba71SJames Collins                $html .= '</li>';
629ab45ba71SJames Collins
630a8eebd82SJames Collins                $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">';
6319cff245bSJames Collins                $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button"
6329cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6339cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('gear') : '') .
6349cff245bSJames Collins                    ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' .
6359cff245bSJames Collins                    $lang['site_tools'] . '</span>') . '</a>';
636a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
637ab45ba71SJames Collins
638ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
639ab45ba71SJames Collins                    $html .= $item;
640ab45ba71SJames Collins                }
641ab45ba71SJames Collins
642ab45ba71SJames Collins                $html .= '</div>';
643ab45ba71SJames Collins                $html .= '</li>';
644ab45ba71SJames Collins
645a8eebd82SJames Collins                $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">';
6469cff245bSJames Collins                $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button"
6479cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6489cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('user') : '') .
6499cff245bSJames Collins                    ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' .
6509cff245bSJames Collins                    $lang['user_tools'] . '</span>') . '</a>';
651a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
652ab45ba71SJames Collins
653ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
654ab45ba71SJames Collins                    $html .= $item;
655ab45ba71SJames Collins                }
656ab45ba71SJames Collins
657ab45ba71SJames Collins                $html .= '</div>';
658ab45ba71SJames Collins                $html .= '</li>';
659ab45ba71SJames Collins
660ab45ba71SJames Collins                break;
661ab45ba71SJames Collins
662ab45ba71SJames Collins            case 'combine':
663ab45ba71SJames Collins                $html .= '<li class="mikio-nav-dropdown">';
6649cff245bSJames Collins                $html .= '<a class="mikio-nav-link" href="#">' .
6659cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') .
6669cff245bSJames Collins                    ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' .
6679cff245bSJames Collins                    tpl_getLang('tools-menu') . '</span>') . '</a>';
668a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
669ab45ba71SJames Collins
670ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>';
671ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
672ab45ba71SJames Collins                    $html .= $item;
673ab45ba71SJames Collins                }
674ab45ba71SJames Collins
675ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
676ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>';
677ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
678ab45ba71SJames Collins                    $html .= $item;
679ab45ba71SJames Collins                }
680ab45ba71SJames Collins
681ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
682ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>';
683ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
684ab45ba71SJames Collins                    $html .= $item;
685ab45ba71SJames Collins                }
686ab45ba71SJames Collins
687ab45ba71SJames Collins                $html .= '</div>';
688ab45ba71SJames Collins                $html .= '</li>';
689ab45ba71SJames Collins                break;
690ab45ba71SJames Collins
691ab45ba71SJames Collins            default:    // seperate
692ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
693a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
694ab45ba71SJames Collins                }
695ab45ba71SJames Collins
696ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
697a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
698a8eebd82SJames Collins                }
699a8eebd82SJames Collins
700a8eebd82SJames Collins                foreach ($userToolsMenu as $item) {
701a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
702ab45ba71SJames Collins                }
703ab45ba71SJames Collins
704ab45ba71SJames Collins                break;
7059cff245bSJames Collins        }//end switch
706ab45ba71SJames Collins
70712030b10SJames Collins        if ($this->getConf('showLightDark') === true) {
7089e41d878SJames Collins            $html .= '<li class="mikio-darklight">
7099e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' .
710*34d5f19aSJames Collins            ($this->getConf('autoLightDark') === true ? $this->mikioInlineIcon('sunmoon', 'mikio-darklight-auto') : '') .
7119e41d878SJames Collins            $this->mikioInlineIcon('sun', 'mikio-darklight-light') .
7129e41d878SJames Collins            $this->mikioInlineIcon('moon', 'mikio-darklight-dark') .
7139e41d878SJames Collins            '</a></li>';
71412030b10SJames Collins        }
71512030b10SJames Collins
716ab45ba71SJames Collins        $html .= '</ul>';
717ab45ba71SJames Collins
7189cff245bSJames Collins        if ($print === true) {
7199cff245bSJames Collins            echo $html;
7209cff245bSJames Collins        }
721a8eebd82SJames Collins        return $html;
722a8eebd82SJames Collins    }
723a8eebd82SJames Collins
724a8eebd82SJames Collins
725a8eebd82SJames Collins    /**
726a8eebd82SJames Collins     * Create a nav element from a string. <uri>|<title>;
727a8eebd82SJames Collins     *
7289cff245bSJames Collins     * @param string $str String to generate nav.
729a8eebd82SJames Collins     * @return string     nav elements generated
730a8eebd82SJames Collins     */
7319cff245bSJames Collins    public function stringToNav(string $str)
73210b40067Snomadjimbob    {
733a8eebd82SJames Collins        $html = '';
734a8eebd82SJames Collins
7353a385f2cSJames Collins        if (empty($str) === false) {
736a8eebd82SJames Collins            $items = explode(';', $str);
737a8eebd82SJames Collins            if (count($items) > 0) {
738a8eebd82SJames Collins                $html .= '<ul class="mikio-nav">';
739a8eebd82SJames Collins                foreach ($items as $item) {
740a8eebd82SJames Collins                    $parts = explode('|', $item);
741a8eebd82SJames Collins                    if ($parts > 1) {
7429cff245bSJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' .
7439cff245bSJames Collins                            strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) .
7449cff245bSJames Collins                            '</a></li>';
745a8eebd82SJames Collins                    }
746a8eebd82SJames Collins                }
747a8eebd82SJames Collins                $html .= '</ul>';
748a8eebd82SJames Collins            }
7492b4583abSJames Collins        }
7502b4583abSJames Collins
751ab45ba71SJames Collins        return $html;
7522b4583abSJames Collins    }
7532b4583abSJames Collins
754a8eebd82SJames Collins    /**
755ab45ba71SJames Collins     * print or return the main navbar
7562b4583abSJames Collins     *
7579cff245bSJames Collins     * @param boolean $print   Print the navbar.
7589cff245bSJames Collins     * @param boolean $showSub Include the sub navbar.
759ab45ba71SJames Collins     * @return string          generated content
7602b4583abSJames Collins     */
7619cff245bSJames Collins    public function includeNavbar(bool $print = true, bool $showSub = false)
76210b40067Snomadjimbob    {
763b39ad16dSJames Collins        global $conf, $USERINFO;
764d3d7d2b7SJames Collins
765d3d7d2b7SJames Collins        $homeUrl = wl();
766d3d7d2b7SJames Collins
7679cff245bSJames Collins        if (plugin_isdisabled('showpageafterlogin') === false) {
768d3d7d2b7SJames Collins            $p = &plugin_load('action', 'showpageafterlogin');
7693a385f2cSJames Collins            if (empty($p) === false) {
7709cff245bSJames Collins                if (is_array($USERINFO) === true && count($USERINFO) > 0) {
771d3d7d2b7SJames Collins                    $homeUrl = wl($p->getConf('page_after_login'));
772d3d7d2b7SJames Collins                }
773d3d7d2b7SJames Collins            }
774b39ad16dSJames Collins        } else {
7759cff245bSJames Collins            if (is_array($USERINFO) === true && count($USERINFO) > 0) {
776b39ad16dSJames Collins                $url = $this->getConf('brandURLUser');
777b39ad16dSJames Collins                if (strlen($url) > 0) {
778b39ad16dSJames Collins                    $homeUrl = $url;
779d3d7d2b7SJames Collins                }
780b39ad16dSJames Collins            } else {
781b39ad16dSJames Collins                $url = $this->getConf('brandURLGuest');
782b39ad16dSJames Collins                if (strlen($url) > 0) {
783b39ad16dSJames Collins                    $homeUrl = $url;
784b39ad16dSJames Collins                }
785b39ad16dSJames Collins            }
786b39ad16dSJames Collins        }
787d3d7d2b7SJames Collins
788ab45ba71SJames Collins        $html = '';
78947161538SJames Collins
7909cff245bSJames Collins        $html .= '<nav class="mikio-navbar'  . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') .
7919cff245bSJames Collins            '">';
792f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
793d3d7d2b7SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">';
7949cff245bSJames Collins        if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) {
795ab45ba71SJames Collins            // Brand image
7969cff245bSJames Collins            if ($this->getConf('navbarUseTitleIcon') === true) {
7979cff245bSJames Collins                $logo = $this->getMediaFile('logo', false);
7989cff245bSJames Collins                ;
7993a385f2cSJames Collins                if (empty($logo) === false) {
800f0241fc4SJames Collins                    $width = $this->getConf('navbarTitleIconWidth');
801f0241fc4SJames Collins                    $height = $this->getConf('navbarTitleIconHeight');
802f0241fc4SJames Collins                    $styles = '';
803f0241fc4SJames Collins
804f0241fc4SJames Collins                    if (strlen($width) > 0 || strlen($height) > 0) {
8059cff245bSJames Collins                        if (ctype_digit($width) === true) {
806f0241fc4SJames Collins                            $styles .= 'max-width:' . intval($width) . 'px;';
8079cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) {
808f0241fc4SJames Collins                            $styles .= 'max-width:' . $width . ';';
8099cff245bSJames Collins                        } elseif (strcasecmp($width, 'none') === 0) {
8107a92c19bSJames Collins                            $styles .= 'max-width:none;';
811f0241fc4SJames Collins                        }
812f0241fc4SJames Collins
8139cff245bSJames Collins                        if (ctype_digit($height) === true) {
814f0241fc4SJames Collins                            $styles .= 'max-height:' . intval($height) . 'px;';
8159cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) {
816f0241fc4SJames Collins                            $styles .= 'max-height:' . $height . ';';
8179cff245bSJames Collins                        } elseif (strcasecmp($height, 'none') === 0) {
8187a92c19bSJames Collins                            $styles .= 'max-height:none;';
819f0241fc4SJames Collins                        }
820f0241fc4SJames Collins
821f0241fc4SJames Collins                        if (strlen($styles) > 0) {
822f0241fc4SJames Collins                            $styles = ' style="' . $styles . '"';
823f0241fc4SJames Collins                        }
8249cff245bSJames Collins                    }//end if
825f0241fc4SJames Collins
826f0241fc4SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>';
8279cff245bSJames Collins                }//end if
8289cff245bSJames Collins            }//end if
829ab45ba71SJames Collins
830ab45ba71SJames Collins            // Brand title
8319cff245bSJames Collins            if ($this->getConf('navbarUseTitleText') === true) {
832ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
833a8eebd82SJames Collins                $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>';
8349cff245bSJames Collins                if ($this->getConf('navbarUseTaglineText') === true) {
835a8eebd82SJames Collins                    $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>';
836ab45ba71SJames Collins                }
837ab45ba71SJames Collins                $html .= '</div>';
838ab45ba71SJames Collins            }
8399cff245bSJames Collins        }//end if
840ab45ba71SJames Collins        $html .= '</a>';
841660b2c71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>';
842ab45ba71SJames Collins
843ab45ba71SJames Collins        // Menus
844ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
845ab45ba71SJames Collins
8469cff245bSJames Collins        $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'),
8479cff245bSJames Collins            $this->getConf('navbarPosRight', 'none')
8489cff245bSJames Collins        ];
849a8eebd82SJames Collins        foreach ($menus as $menuType) {
850a8eebd82SJames Collins            switch ($menuType) {
851a8eebd82SJames Collins                case 'custom':
852a8eebd82SJames Collins                    $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', ''));
853a8eebd82SJames Collins                    break;
854a8eebd82SJames Collins                case 'search':
855ab45ba71SJames Collins                    $html .= '<div class="mikio-nav-item">';
856ab45ba71SJames Collins                    $html .= $this->includeSearch(false);
857ab45ba71SJames Collins                    $html .= '</div>';
858a8eebd82SJames Collins                    break;
859a8eebd82SJames Collins                case 'dokuwiki':
8609cff245bSJames Collins                    $html .= $this->includeDWMenu(false);
861a8eebd82SJames Collins                    break;
862a8eebd82SJames Collins            }
863a8eebd82SJames Collins        }
864ab45ba71SJames Collins
865ab45ba71SJames Collins        $html .= '</div>';
866f8039bf2SJames Collins        $html .= '</div>';
867ab45ba71SJames Collins        $html .= '</nav>';
868ab45ba71SJames Collins
869a8eebd82SJames Collins        // Sub Navbar
8709cff245bSJames Collins        if ($showSub === true) {
8719cff245bSJames Collins            $sub = $this->includePage('submenu', false);
8723a385f2cSJames Collins            if (empty($sub) === false) {
8739cff245bSJames Collins                $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>';
8749cff245bSJames Collins            }
875ab45ba71SJames Collins        }
876ab45ba71SJames Collins
8779cff245bSJames Collins        if ($print === true) {
8789cff245bSJames Collins            echo $html;
8799cff245bSJames Collins        }
880ab45ba71SJames Collins        return $html;
881ab45ba71SJames Collins    }
882ab45ba71SJames Collins
883ab45ba71SJames Collins
884a8eebd82SJames Collins    /**
885a8eebd82SJames Collins     * Is there a sidebar
886a8eebd82SJames Collins     *
8879cff245bSJames Collins     * @param   string $prefix Sidebar prefix to use when searching.
888a8eebd82SJames Collins     * @return  boolean        if sidebar exists
889a8eebd82SJames Collins     */
8909cff245bSJames Collins    public function sidebarExists(string $prefix = '')
89110b40067Snomadjimbob    {
892a8eebd82SJames Collins        global $conf;
893a8eebd82SJames Collins
8943a385f2cSJames Collins        if (strcasecmp($prefix, 'left') === 0) {
8959cff245bSJames Collins            $prefix = '';
8969cff245bSJames Collins        }
897a8eebd82SJames Collins
898a8eebd82SJames Collins        return $this->pageExists($conf['sidebar' . $prefix]);
899a8eebd82SJames Collins    }
900a8eebd82SJames Collins
901a8eebd82SJames Collins
902a8eebd82SJames Collins    /**
903ab45ba71SJames Collins     * Print or return the sidebar content
904ab45ba71SJames Collins     *
9059cff245bSJames Collins     * @param   string  $prefix Sidebar prefix to use when searching.
9069cff245bSJames Collins     * @param   boolean $print  Print the generated content to the output buffer.
9079cff245bSJames Collins     * @param   boolean $parse  Parse the content.
908ab45ba71SJames Collins     * @return  string          generated content
909ab45ba71SJames Collins     */
9109cff245bSJames Collins    public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true)
91110b40067Snomadjimbob    {
912ab45ba71SJames Collins        global $conf, $ID;
913ab45ba71SJames Collins
914ab45ba71SJames Collins        $html = '';
915ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
916ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
917ab45ba71SJames Collins
9183a385f2cSJames Collins        if (empty($confPrefix) === true) {
9199cff245bSJames Collins            $confPrefix = 'Left';
9209cff245bSJames Collins        }
9211cdedf28SJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9229cff245bSJames Collins            $prefix = '';
9239cff245bSJames Collins        }
924ab45ba71SJames Collins
9251cdedf28SJames Collins        $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar'];
926ab45ba71SJames Collins
9279cff245bSJames Collins        if (
9289cff245bSJames Collins            $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false &&
9291cdedf28SJames Collins            p_get_metadata($ID, 'nosidebar', false) === null
9309cff245bSJames Collins        ) {
9319cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'header', false);
9323a385f2cSJames Collins            if (empty($content) === false) {
9339cff245bSJames Collins                $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
9349cff245bSJames Collins            }
935ab45ba71SJames Collins
9363a385f2cSJames Collins            if (empty($prefix) === true) {
9379cff245bSJames Collins                $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'),
9389cff245bSJames Collins                    $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4')
9399cff245bSJames Collins                ];
940ab45ba71SJames Collins
941a8eebd82SJames Collins                foreach ($rows as $row) {
942a8eebd82SJames Collins                    switch ($row) {
943a8eebd82SJames Collins                        case 'search':
9449cff245bSJames Collins                            $html .= $this->includeSearch(false);
945a8eebd82SJames Collins                            break;
946a8eebd82SJames Collins                        case 'logged in user':
9479cff245bSJames Collins                            $html .= $this->includeLoggedIn(false);
948a8eebd82SJames Collins                            break;
949a8eebd82SJames Collins                        case 'content':
9509cff245bSJames Collins                            $content = $this->includePage($sidebarPage, false);
9513a385f2cSJames Collins                            if (empty($content) === false) {
9529cff245bSJames Collins                                $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9539cff245bSJames Collins                            }
954a8eebd82SJames Collins                            break;
955a8eebd82SJames Collins                        case 'tags':
956a8eebd82SJames Collins                            $html .= '<div class="mikio-tags"></div>';
957a8eebd82SJames Collins                    }
958a8eebd82SJames Collins                }
959a8eebd82SJames Collins            } else {
9609cff245bSJames Collins                $content = $this->includePage($sidebarPage, false);
9613a385f2cSJames Collins                if (empty($content) === false) {
9629cff245bSJames Collins                    $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9639cff245bSJames Collins                }
9649cff245bSJames Collins            }//end if
9659cff245bSJames Collins
9669cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'footer', false);
9673a385f2cSJames Collins            if (empty($content) === false) {
9689cff245bSJames Collins                $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
9699cff245bSJames Collins            }
9709cff245bSJames Collins        }//end if
9719cff245bSJames Collins
9723a385f2cSJames Collins        if (empty($html) === true) {
9733a385f2cSJames Collins            if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) {
9749cff245bSJames Collins                $html = '&nbsp;';
9759cff245bSJames Collins            }
9769cff245bSJames Collins            if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) {
9779cff245bSJames Collins                $html = '&nbsp;';
9789cff245bSJames Collins            }
979a8eebd82SJames Collins        }
980ab45ba71SJames Collins
9813a385f2cSJames Collins        if (empty($html) === false) {
9821cdedf28SJames Collins            $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) .
9839cff245bSJames Collins                '"><a class="mikio-sidebar-toggle' .
9849cff245bSJames Collins                ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' .
9859cff245bSJames Collins                tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' .
9869cff245bSJames Collins                $html . '</div></aside>';
987ab45ba71SJames Collins        }
988ab45ba71SJames Collins
9899cff245bSJames Collins        if ($parse === true) {
9909cff245bSJames Collins            $html = $this->includeIcons($html);
9913a04a100SJames Collins        }
9929cff245bSJames Collins        if ($print === true) {
9939cff245bSJames Collins            echo $html;
994ab45ba71SJames Collins        }
995ab45ba71SJames Collins        return $html;
996ab45ba71SJames Collins    }
997ab45ba71SJames Collins
998ab45ba71SJames Collins
999a8eebd82SJames Collins    /**
1000ab45ba71SJames Collins     * Print or return the page tools content
1001ab45ba71SJames Collins     *
10029cff245bSJames Collins     * @param   boolean $print     Print the generated content to the output buffer.
10039cff245bSJames Collins     * @param   boolean $includeId Include the dw__pagetools id in the element.
1004ab45ba71SJames Collins     * @return  string             generated content
1005ab45ba71SJames Collins     */
10069cff245bSJames Collins    public function includePageTools(bool $print = true, bool $includeId = false)
100710b40067Snomadjimbob    {
10081293ce10SJames Collins        global $USERINFO;
10091293ce10SJames Collins
10109cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
1011ab45ba71SJames Collins        $html = '';
1012ab45ba71SJames Collins
10139cff245bSJames Collins        $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
1014b9c0582bSJames Collins        $html .= '<ul class="tools">';
1015ab45ba71SJames Collins
1016ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
1017ab45ba71SJames Collins        foreach ($items as $item) {
10189cff245bSJames Collins            $classes = [];
10193fd763a0SJames Collins            $classes[] = $item->getType();
10203fd763a0SJames Collins            $attr = $item->getLinkAttributes();
10213fd763a0SJames Collins
10229cff245bSJames Collins            if (empty($attr['class']) === false) {
10233fd763a0SJames Collins                $classes = array_merge($classes, explode(' ', $attr['class']));
1024ab45ba71SJames Collins            }
1025ab45ba71SJames Collins
10263fd763a0SJames Collins            $classes = array_unique($classes);
10273fd763a0SJames Collins
10281293ce10SJames Collins            $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()));
10299cff245bSJames Collins            if (
10303a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
10313a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
10323a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true))
10339cff245bSJames Collins            ) {
10343fd763a0SJames Collins                $html .= '<li class="' . implode(' ', $classes) . '">';
10359cff245bSJames Collins                $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' .
10369cff245bSJames Collins                    $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) .
10379cff245bSJames Collins                    '</div><span class="a11y">' . $item->getLabel() . '</span></a>';
10383fd763a0SJames Collins                $html .= '</li>';
10393fd763a0SJames Collins            }
10409cff245bSJames Collins        }//end foreach
10413fd763a0SJames Collins
10423fd763a0SJames Collins        $html .= '</ul>';
1043ab45ba71SJames Collins        $html .= '</nav>';
1044ab45ba71SJames Collins
10459cff245bSJames Collins        if ($print === true) {
10469cff245bSJames Collins            echo $html;
10479cff245bSJames Collins        }
1048ab45ba71SJames Collins        return $html;
1049ab45ba71SJames Collins    }
1050ab45ba71SJames Collins
1051ab45ba71SJames Collins
1052a8eebd82SJames Collins    /**
1053a8eebd82SJames Collins     * Print or return the search bar
1054a8eebd82SJames Collins     *
10559cff245bSJames Collins     * @param   boolean $print Print content.
1056a8eebd82SJames Collins     * @return  string         contents of the search bar
1057a8eebd82SJames Collins     */
10589cff245bSJames Collins    public function includeSearch(bool $print = true)
105910b40067Snomadjimbob    {
10609cff245bSJames Collins        global $lang, $ID, $ACT, $QUERY;
1061ab45ba71SJames Collins        $html = '';
1062ab45ba71SJames Collins
10639cff245bSJames Collins        $html .= '<form class="mikio-search search" action="' . wl() .
10649cff245bSJames Collins            '" accept-charset="utf-8" method="get" role="search">';
1065a8eebd82SJames Collins        $html .= '<input type="hidden" name="do" value="search">';
1066a8eebd82SJames Collins        $html .= '<input type="hidden" name="id" value="' . $ID . '">';
1067c1cb9f15SChris MacMackin        $html .= '<input name="q" ';
10689cff245bSJames Collins        if ($this->getConf('searchUseTypeahead') === true) {
1069c1cb9f15SChris MacMackin            $html .= 'class="search_typeahead" ';
1070c1cb9f15SChris MacMackin        }
10719cff245bSJames Collins        $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' .
10723a385f2cSJames Collins            ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
1073a8eebd82SJames Collins        $html .= '<button type="submit" title="' .  $lang['btn_search'] . '">';
10743a385f2cSJames Collins        if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) {
1075a8eebd82SJames Collins            $html .= $this->mikioInlineIcon('search');
1076ab45ba71SJames Collins        } else {
1077ab45ba71SJames Collins            $html .= $lang['btn_search'];
1078ab45ba71SJames Collins        }
1079ab45ba71SJames Collins        $html .= '</button>';
1080ab45ba71SJames Collins        $html .= '</form>';
1081ab45ba71SJames Collins
10829cff245bSJames Collins        if ($print === true) {
10839cff245bSJames Collins            echo $html;
10849cff245bSJames Collins        }
1085ab45ba71SJames Collins        return $html;
1086ab45ba71SJames Collins    }
1087ab45ba71SJames Collins
1088ab45ba71SJames Collins
1089a8eebd82SJames Collins    /**
1090a8eebd82SJames Collins     * Print or return content
1091a8eebd82SJames Collins     *
10929cff245bSJames Collins     * @param   boolean $print Print content.
1093a8eebd82SJames Collins     * @return  string         contents
1094a8eebd82SJames Collins     */
10959cff245bSJames Collins    public function includeContent(bool $print = true)
109610b40067Snomadjimbob    {
1097ab45ba71SJames Collins        ob_start();
10989cff245bSJames Collins        tpl_content(false);
1099ab45ba71SJames Collins        $html = ob_get_contents();
1100ab45ba71SJames Collins        ob_end_clean();
1101ab45ba71SJames Collins
1102ab45ba71SJames Collins        $html = $this->includeIcons($html);
1103ab45ba71SJames Collins        $html = $this->parseContent($html);
1104ab45ba71SJames Collins
1105ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
1106ab45ba71SJames Collins
11079cff245bSJames Collins        if ($this->getConf('heroTitle') === false) {
11089cff245bSJames Collins            $html = '<div class="mikio-tags"></div>' . $html;
11099cff245bSJames Collins        }
1110a8eebd82SJames Collins
1111a8eebd82SJames Collins        $html = '<div class="mikio-article-content">' . $html . '</div>';
1112a8eebd82SJames Collins
11139cff245bSJames Collins        if ($print === true) {
11149cff245bSJames Collins            echo $html;
11159cff245bSJames Collins        }
1116ab45ba71SJames Collins        return $html;
1117ab45ba71SJames Collins    }
1118ab45ba71SJames Collins
1119a8eebd82SJames Collins    /**
1120ab45ba71SJames Collins     * Print or return footer
1121ab45ba71SJames Collins     *
11229cff245bSJames Collins     * @param   boolean $print Print footer.
11239cff245bSJames Collins     * @return  string         HTML string containing footer
1124ab45ba71SJames Collins     */
11259cff245bSJames Collins    public function includeFooter(bool $print = true)
112610b40067Snomadjimbob    {
1127ab45ba71SJames Collins        global $ACT;
1128ab45ba71SJames Collins
1129ab45ba71SJames Collins        $html = '';
1130ab45ba71SJames Collins
1131ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
11329cff245bSJames Collins        $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>';
11339cff245bSJames Collins        $html .= $this->includePage('footer', false);
1134ab45ba71SJames Collins
1135a8eebd82SJames Collins        $html .= $this->stringToNav($this->getConf('footerCustomMenuText'));
1136ab45ba71SJames Collins
11379cff245bSJames Collins        if ($this->getConf('footerSearch') === true) {
1138ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
11399cff245bSJames Collins            $html .= $this->includeSearch(false);
1140ab45ba71SJames Collins            $html .= '</div>';
1141ab45ba71SJames Collins        }
1142ab45ba71SJames Collins
1143a8eebd82SJames Collins        $showPageTools = $this->getConf('pageToolsFooter');
11449cff245bSJames Collins        if (
11453a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 ||
11463a385f2cSJames Collins            $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0)
11479cff245bSJames Collins        ) {
11489cff245bSJames Collins            $html .= $this->includePageTools(false);
11499cff245bSJames Collins        }
1150ab45ba71SJames Collins
11519cff245bSJames Collins        $meta['licenseType']            = ['multichoice', '_choices' => ['none', 'badge', 'button']];
11529cff245bSJames Collins        $meta['licenseImageOnly']       = ['onoff'];
1153ab45ba71SJames Collins
1154ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
11559cff245bSJames Collins        if ($licenseType !== 'none') {
11569cff245bSJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true);
1157ab45ba71SJames Collins        }
1158ab45ba71SJames Collins
1159ab45ba71SJames Collins        $html .= '</footer>';
1160ab45ba71SJames Collins
11619cff245bSJames Collins        if ($print === true) {
11629cff245bSJames Collins            echo $html;
11639cff245bSJames Collins        }
1164ab45ba71SJames Collins        return $html;
1165ab45ba71SJames Collins    }
1166ab45ba71SJames Collins
1167ab45ba71SJames Collins
1168a8eebd82SJames Collins    /**
1169ab45ba71SJames Collins     * Print or return breadcrumb trail
1170ab45ba71SJames Collins     *
11719cff245bSJames Collins     * @param   boolean $print Print out trail.
11729cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
11739cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
1174ab45ba71SJames Collins     */
11759cff245bSJames Collins    public function includeBreadcrumbs(bool $print = true, bool $parse = true)
117610b40067Snomadjimbob    {
1177a8eebd82SJames Collins        global $conf, $ID, $lang, $ACT;
1178a8eebd82SJames Collins
11793a385f2cSJames Collins        if (
11803a385f2cSJames Collins            $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 &&
118195372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0
11823a385f2cSJames Collins        ) {
11839cff245bSJames Collins            return '';
11849cff245bSJames Collins        }
1185ab45ba71SJames Collins
1186ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
1187f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
11883a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
118995372bffSJames Collins            if ($conf['breadcrumbs'] !== 0) {
11909cff245bSJames Collins                if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) {
1191ab45ba71SJames Collins                    ob_start();
119275adba86SJames Collins                    tpl_breadcrumbs();
1193ab45ba71SJames Collins                    $html .= ob_get_contents();
1194ab45ba71SJames Collins                    ob_end_clean();
1195ab45ba71SJames Collins                } else {
1196ab45ba71SJames Collins                    $sep = '•';
1197ab45ba71SJames Collins                    $prefix = $lang['breadcrumb'];
1198ab45ba71SJames Collins
11999cff245bSJames Collins                    if ($this->getConf('breadcrumbSep') === true) {
1200ab45ba71SJames Collins                        $sep = $this->getConf('breadcrumbSepText');
12019cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-sep', false);
1202ab45ba71SJames Collins
12039cff245bSJames Collins                        if ($img !== false) {
1204ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1205ab45ba71SJames Collins                        }
120647161538SJames Collins                    }
120747161538SJames Collins
12089cff245bSJames Collins                    if ($this->getConf('breadcrumbPrefix') === true) {
1209ab45ba71SJames Collins                        $prefix = $this->getConf('breadcrumbPrefixText');
12109cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-prefix', false);
1211ab45ba71SJames Collins
12129cff245bSJames Collins                        if ($img !== false) {
1213ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
1214ab45ba71SJames Collins                        }
1215ab45ba71SJames Collins                    }
1216ab45ba71SJames Collins
1217ab45ba71SJames Collins                    $crumbs = breadcrumbs();
1218ab45ba71SJames Collins
1219ab45ba71SJames Collins                    $html .= '<ul>';
12203a385f2cSJames Collins                    if (empty($prefix) === false) {
12219cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12229cff245bSJames Collins                    }
1223ab45ba71SJames Collins
1224ab45ba71SJames Collins                    $last = count($crumbs);
1225ab45ba71SJames Collins                    $i    = 0;
1226ab45ba71SJames Collins                    foreach ($crumbs as $id => $name) {
1227ab45ba71SJames Collins                        $i++;
122895372bffSJames Collins                        if ($i !== 1) {
1229ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
123095372bffSJames Collins                        }
12319cff245bSJames Collins                        $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>';
12329cff245bSJames Collins                        $html .= tpl_pagelink($id, null, true);
1233ab45ba71SJames Collins                        $html .= '</li>';
1234ab45ba71SJames Collins                    }
1235ab45ba71SJames Collins
1236ab45ba71SJames Collins                    $html .= '</ul>';
12379cff245bSJames Collins                }//end if
12389cff245bSJames Collins            }//end if
12399cff245bSJames Collins        }//end if
12403d11a778SJames Collins
12413d11a778SJames Collins        $html .= '</div>';
12423d11a778SJames Collins        $html .= '</div>';
12433d11a778SJames Collins
12449cff245bSJames Collins        if ($parse === true) {
12459cff245bSJames Collins            $html = $this->includeIcons($html);
12469cff245bSJames Collins        }
12479cff245bSJames Collins        if ($print === true) {
12489cff245bSJames Collins            echo $html;
12499cff245bSJames Collins        }
12503d11a778SJames Collins        return $html;
12513d11a778SJames Collins    }
12523d11a778SJames Collins
12533d11a778SJames Collins    /**
12543d11a778SJames Collins     * Print or return you are here trail
12553d11a778SJames Collins     *
12569cff245bSJames Collins     * @param   boolean $print Print out trail.
12579cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12589cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
12593d11a778SJames Collins     */
12609cff245bSJames Collins    public function includeYouAreHere(bool $print = true, bool $parse = true)
12613d11a778SJames Collins    {
12623d11a778SJames Collins        global $conf, $ID, $lang, $ACT;
12633d11a778SJames Collins
12643a385f2cSJames Collins        if (
12653a385f2cSJames Collins            $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 &&
126695372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0
12673a385f2cSJames Collins        ) {
12689cff245bSJames Collins            return '';
12699cff245bSJames Collins        }
12703d11a778SJames Collins
12713d11a778SJames Collins        $html = '<div class="mikio-youarehere">';
12723d11a778SJames Collins        $html .= '<div class="mikio-container">';
12733a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
127495372bffSJames Collins            if ($conf['youarehere'] !== 0) {
12759cff245bSJames Collins                if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) {
127695372bffSJames Collins                    $html .= '<div class="mikio-bcdw">';
1277ab45ba71SJames Collins                    ob_start();
127875adba86SJames Collins                    tpl_youarehere();
1279ab45ba71SJames Collins                    $html .= ob_get_contents();
1280ab45ba71SJames Collins                    ob_end_clean();
128195372bffSJames Collins                    $html .= '</div>';
1282ab45ba71SJames Collins                } else {
1283ab45ba71SJames Collins                    $sep = ' » ';
1284ab45ba71SJames Collins                    $prefix = $lang['youarehere'];
1285ab45ba71SJames Collins
12869cff245bSJames Collins                    if ($this->getConf('youarehereSep') === true) {
12873d11a778SJames Collins                        $sep = $this->getConf('youarehereSepText');
12889cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-sep', false);
1289ab45ba71SJames Collins
12909cff245bSJames Collins                        if ($img !== false) {
1291ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1292ab45ba71SJames Collins                        }
129375adba86SJames Collins                    }
129475adba86SJames Collins
12959cff245bSJames Collins                    if ($this->getConf('youareherePrefix') === true) {
12963d11a778SJames Collins                        $prefix = $this->getConf('youareherePrefixText');
12979cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-prefix', false);
1298ab45ba71SJames Collins
12999cff245bSJames Collins                        if ($img !== false) {
1300ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
130175adba86SJames Collins                        }
130247161538SJames Collins                    }
130347161538SJames Collins
1304ab45ba71SJames Collins                    $html .= '<ul>';
13053a385f2cSJames Collins                    if (empty($prefix) === false) {
13069cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
13079cff245bSJames Collins                    }
13089cff245bSJames Collins                    $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>';
1309ab45ba71SJames Collins
1310ab45ba71SJames Collins                    $parts = explode(':', $ID);
1311ab45ba71SJames Collins                    $count = count($parts);
1312ab45ba71SJames Collins
1313ab45ba71SJames Collins                    $part = '';
13149cff245bSJames Collins                    for ($i = 0; $i < ($count - 1); $i++) {
1315ab45ba71SJames Collins                        $part .= $parts[$i] . ':';
1316ab45ba71SJames Collins                        $page = $part;
13179cff245bSJames Collins                        if ($page === $conf['start']) {
13189cff245bSJames Collins                            continue;
13199cff245bSJames Collins                        }
1320ab45ba71SJames Collins
1321ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
13229cff245bSJames Collins                        $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1323ab45ba71SJames Collins                    }
1324ab45ba71SJames Collins
1325ab45ba71SJames Collins                    resolve_pageid('', $page, $exists);
13269cff245bSJames Collins                    if ((isset($page) === true && $page === $part . $parts[$i]) === false) {
1327ab45ba71SJames Collins                        $page = $part . $parts[$i];
13289cff245bSJames Collins                        if ($page !== $conf['start']) {
1329ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
13309cff245bSJames Collins                            $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1331ab45ba71SJames Collins                        }
1332ab45ba71SJames Collins                    }
1333ab45ba71SJames Collins
1334ab45ba71SJames Collins                    $html .= '</ul>';
13359cff245bSJames Collins                }//end if
13369cff245bSJames Collins            }//end if
1337ab45ba71SJames Collins
13383d11a778SJames Collins            $showLast = $this->getConf('youarehereShowLast');
13399cff245bSJames Collins            if ($showLast !== 0) {
1340a8eebd82SJames Collins                preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches);
13419cff245bSJames Collins                if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) {
1342a8eebd82SJames Collins                    $count = count($matches[0]);
1343a8eebd82SJames Collins                    $list = '';
1344a8eebd82SJames Collins
1345a8eebd82SJames Collins                    // Show Home
1346a8eebd82SJames Collins                    $list .= $matches[0][0] . $matches[0][1];
1347a8eebd82SJames Collins
1348a8eebd82SJames Collins                    $list .= '<li>...</li>';
13499cff245bSJames Collins                    for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) {
1350a8eebd82SJames Collins                        $list .= $matches[0][$i];
1351a8eebd82SJames Collins                    }
1352a8eebd82SJames Collins
1353a8eebd82SJames Collins                    $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html);
1354a8eebd82SJames Collins                }
1355a8eebd82SJames Collins            }
1356a8eebd82SJames Collins
13573d11a778SJames Collins            switch ($this->getConf('youarehereHome')) {
1358a8eebd82SJames Collins                case 'none':
1359a8eebd82SJames Collins                    $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2);
1360a8eebd82SJames Collins                    break;
1361a8eebd82SJames Collins                case 'home':
1362a8eebd82SJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1);
1363a8eebd82SJames Collins                    break;
1364a8eebd82SJames Collins                case 'icon':
13659cff245bSJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' .
13669cff245bSJames Collins                        $this->mikioInlineIcon('home') . '$3', $html, 1);
1367a8eebd82SJames Collins                    break;
1368a8eebd82SJames Collins            }
1369a8eebd82SJames Collins        } else {
1370a8eebd82SJames Collins            $html .= '&#8810; ';
13719cff245bSJames Collins            if (isset($_GET['page']) === true) {
13729cff245bSJames Collins                $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
1373a8eebd82SJames Collins            }
13744057121fSJames Collins            $html .= '<a href="' . wl($ID) . '">View Page</a>';
13759cff245bSJames Collins        }//end if
13769cff245bSJames Collins
13779cff245bSJames Collins        $html .= '</div>';
13789cff245bSJames Collins        $html .= '</div>';
13799cff245bSJames Collins
13809cff245bSJames Collins        if ($parse === true) {
13819cff245bSJames Collins            $html = $this->includeIcons($html);
1382a8eebd82SJames Collins        }
13839cff245bSJames Collins        if ($print === true) {
13849cff245bSJames Collins            echo $html;
13859cff245bSJames Collins        }
1386ab45ba71SJames Collins        return $html;
1387ab45ba71SJames Collins    }
1388ab45ba71SJames Collins
13891785fc73SJames Collins    /**
13901785fc73SJames Collins     * Get Page Title
13919cff245bSJames Collins     *
13929cff245bSJames Collins     * @return string page title
13931785fc73SJames Collins     */
139410b40067Snomadjimbob    public function parsePageTitle()
139510b40067Snomadjimbob    {
13962060e56cSJames Collins        global $ID;
13972060e56cSJames Collins
13982060e56cSJames Collins        $title = p_get_first_heading($ID);
13999cff245bSJames Collins        if (strlen($title) <= 0) {
14009cff245bSJames Collins            $title = tpl_pagetitle(null, true);
14019cff245bSJames Collins        }
14021785fc73SJames Collins        $title = $this->includeIcons($title);
14031785fc73SJames Collins
14041785fc73SJames Collins        return $title;
14051785fc73SJames Collins    }
14061785fc73SJames Collins
1407ab45ba71SJames Collins
140875adba86SJames Collins    /**
1409a8eebd82SJames Collins     * Print or return hero block
141075adba86SJames Collins     *
14119cff245bSJames Collins     * @param   boolean $print Print content.
1412a8eebd82SJames Collins     * @return  string         contents of hero
141375adba86SJames Collins     */
14149cff245bSJames Collins    public function includeHero(bool $print = true)
141510b40067Snomadjimbob    {
1416a8eebd82SJames Collins        $html = '';
141747161538SJames Collins
14189cff245bSJames Collins        if ($this->getConf('heroTitle') === true) {
1419a8eebd82SJames Collins            $html .= '<div class="mikio-hero">';
1420f8039bf2SJames Collins            $html .= '<div class="mikio-container">';
1421a8eebd82SJames Collins            $html .= '<div class="mikio-hero-text">';
14223a385f2cSJames Collins            if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) {
14239cff245bSJames Collins                $html .= $this->includeYouAreHere(false);
14249cff245bSJames Collins            }
14253a385f2cSJames Collins            if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) {
14269cff245bSJames Collins                $html .= $this->includeBreadcrumbs(false);
14279cff245bSJames Collins            }
1428ab45ba71SJames Collins
1429a8eebd82SJames Collins            $html .= '<h1 class="mikio-hero-title">';
14301785fc73SJames Collins            $html .= $this->parsePageTitle();    // No idea why this requires a blank space afterwards to work?
1431a8eebd82SJames Collins            $html .= '</h1>';
1432a8eebd82SJames Collins            $html .= '<h2 class="mikio-hero-subtitle"></h2>';
1433a8eebd82SJames Collins            $html .= '</div>';
143447161538SJames Collins
14359cff245bSJames Collins            $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true));
1436a8eebd82SJames Collins            $hero_image_resize_class = '';
14373a385f2cSJames Collins            if (empty($hero_image) === false) {
1438a8eebd82SJames Collins                $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"';
1439a8eebd82SJames Collins                $hero_image_resize_class = ' mikio-hero-image-resize';
144047161538SJames Collins            }
1441a8eebd82SJames Collins
14429cff245bSJames Collins            $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image .
14439cff245bSJames Collins                '><div class="mikio-tags"></div></div>';
1444a8eebd82SJames Collins
1445a8eebd82SJames Collins            $html .= '</div>';
1446f8039bf2SJames Collins            $html .= '</div>';
14479cff245bSJames Collins        }//end if
14489cff245bSJames Collins
14499cff245bSJames Collins        if ($print === true) {
14509cff245bSJames Collins            echo $html;
145175adba86SJames Collins        }
1452a8eebd82SJames Collins
1453a8eebd82SJames Collins        return $html;
145475adba86SJames Collins    }
145575adba86SJames Collins
145675adba86SJames Collins
145775adba86SJames Collins    /**
1458a8eebd82SJames Collins     * Print or return out TOC
145975adba86SJames Collins     *
14609cff245bSJames Collins     * @param   boolean $print Print TOC.
14619cff245bSJames Collins     * @param   boolean $parse Parse icons.
1462a8eebd82SJames Collins     * @return  string         contents of TOC
146375adba86SJames Collins     */
14649cff245bSJames Collins    public function includeTOC(bool $print = true, bool $parse = true)
146510b40067Snomadjimbob    {
1466ab45ba71SJames Collins        $html = '';
14672b4583abSJames Collins
1468ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
1469ab45ba71SJames Collins
14703a385f2cSJames Collins        if (empty($tocHtml) === false) {
1471f65a4e5eSJames Collins            $tocHtml = preg_replace(
1472f65a4e5eSJames Collins                '/(<h3.+?toggle.+?>)(.+?)<\/h3>/',
1473f65a4e5eSJames Collins                '$1' .
1474f65a4e5eSJames Collins                $this->mikioInlineIcon('hamburger', 'hamburger') . '$2' .
1475f65a4e5eSJames Collins                $this->mikioInlineIcon('down-arrow', 'down-arrow') . '</h3>',
1476f65a4e5eSJames Collins                $tocHtml
1477f65a4e5eSJames Collins            );
1478ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
1479a8eebd82SJames Collins            $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml);
1480ab45ba71SJames Collins
1481ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
1482ab45ba71SJames Collins            $html .= $tocHtml;
1483ab45ba71SJames Collins            $html .= '</div>';
14842b4583abSJames Collins        }
14852b4583abSJames Collins
14869cff245bSJames Collins        if ($parse === true) {
14879cff245bSJames Collins            $html = $this->includeIcons($html);
14889cff245bSJames Collins        }
14899cff245bSJames Collins
14909cff245bSJames Collins        if ($print === true) {
1491ab45ba71SJames Collins            echo $html;
1492ab45ba71SJames Collins        }
1493ab45ba71SJames Collins
14949cff245bSJames Collins        return $html;
14959cff245bSJames Collins    }
14969cff245bSJames Collins
1497ab45ba71SJames Collins
1498a8eebd82SJames Collins    /**
1499ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
1500ab45ba71SJames Collins     *
15019cff245bSJames Collins     * @param   string $str Content to parse.
1502ab45ba71SJames Collins     * @return  string      parsed string
1503ab45ba71SJames Collins     */
15049cff245bSJames Collins    public function includeIcons(string $str)
150510b40067Snomadjimbob    {
1506ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
1507ab45ba71SJames Collins
1508ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
15093a385f2cSJames Collins        if (empty($iconTag) === true) {
15109cff245bSJames Collins            return $str;
15119cff245bSJames Collins        }
1512ab45ba71SJames Collins
15139cff245bSJames Collins        if (
15149cff245bSJames Collins            in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true ||
15153a385f2cSJames Collins            strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0
15169cff245bSJames Collins        ) {
1517a2005a27SJames Collins            $content = $str;
1518a2005a27SJames Collins            $preview = null;
1519a2005a27SJames Collins
15203a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15219cff245bSJames Collins                $html = new \simple_html_dom();
1522a2005a27SJames Collins                $html->stripRNAttrValues = false;
1523a2005a27SJames Collins                $html->load($str, true, false);
1524a2005a27SJames Collins
1525a2005a27SJames Collins                $preview = $html->find('div.preview');
15269cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1527a2005a27SJames Collins                    $content = $preview[0]->innertext;
1528a2005a27SJames Collins                }
1529a2005a27SJames Collins            }
1530a2005a27SJames Collins
15311785fc73SJames Collins            $page_regex = '/(.*)/';
15329cff245bSJames Collins            if (stripos($str, '<pre') !== false) {
15331785fc73SJames Collins                $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/';
15341785fc73SJames Collins            }
15351785fc73SJames Collins
15361785fc73SJames Collins            $content = preg_replace_callback($page_regex, function ($icons) {
1537a2005a27SJames Collins                $iconTag = $this->getConf('iconTag', 'icon');
1538a2005a27SJames Collins
153910b40067Snomadjimbob                return preg_replace_callback(
154010b40067Snomadjimbob                    '/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
1541ab45ba71SJames Collins                    function ($matches) {
1542ab45ba71SJames Collins                        global $MIKIO_ICONS;
1543ab45ba71SJames Collins
1544ab45ba71SJames Collins                        $s = $matches[0];
1545ab45ba71SJames Collins
1546ab45ba71SJames Collins                        if (count($MIKIO_ICONS) > 0) {
1547ab45ba71SJames Collins                            $icon = $MIKIO_ICONS[0];
1548ab45ba71SJames Collins
1549ab45ba71SJames Collins                            if (count($matches) > 1) {
1550ab45ba71SJames Collins                                $e = explode(' ', $matches[1]);
1551ab45ba71SJames Collins
1552ab45ba71SJames Collins                                if (count($e) > 1) {
1553ab45ba71SJames Collins                                    foreach ($MIKIO_ICONS as $iconItem) {
15549cff245bSJames Collins                                        if (strcasecmp($iconItem['name'], $e[0]) === 0) {
1555ab45ba71SJames Collins                                            $icon = $iconItem;
1556ab45ba71SJames Collins
1557ab45ba71SJames Collins                                            $s = $icon['insert'];
1558ab45ba71SJames Collins                                            for ($i = 1; $i < 9; $i++) {
15591cdedf28SJames Collins                                                if (count($e) < $i || empty($e[$i]) === true) {
15609cff245bSJames Collins                                                    if (isset($icon['$' . $i]) === true) {
1561ab45ba71SJames Collins                                                        $s = str_replace('$' . $i, $icon['$' . $i], $s);
1562ab45ba71SJames Collins                                                    }
1563ab45ba71SJames Collins                                                } else {
1564ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $e[$i], $s);
1565ab45ba71SJames Collins                                                }
1566ab45ba71SJames Collins                                            }
1567ab45ba71SJames Collins
1568ab45ba71SJames Collins                                            $dir = '';
15699cff245bSJames Collins                                            if (isset($icon['dir']) === true) {
15709cff245bSJames Collins                                                $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
15719cff245bSJames Collins                                            }
1572ab45ba71SJames Collins
1573ab45ba71SJames Collins                                            $s = str_replace('$0', $dir, $s);
1574ab45ba71SJames Collins
1575ab45ba71SJames Collins                                            break;
15769cff245bSJames Collins                                        }//end if
15779cff245bSJames Collins                                    }//end foreach
1578ab45ba71SJames Collins                                } else {
1579ab45ba71SJames Collins                                    $s = str_replace('$1', $matches[1], $icon['insert']);
15809cff245bSJames Collins                                }//end if
15819cff245bSJames Collins                            }//end if
15829cff245bSJames Collins                        }//end if
158375adba86SJames Collins
1584ab45ba71SJames Collins                        $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
15859cff245bSJames Collins                        if ($count === 0) {
1586ab45ba71SJames Collins                            $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
1587ab45ba71SJames Collins                        }
1588ab45ba71SJames Collins
1589ab45ba71SJames Collins                        return $s;
1590ab45ba71SJames Collins                    },
159110b40067Snomadjimbob                    $icons[0]
159210b40067Snomadjimbob                );
1593a2005a27SJames Collins            }, $content);
1594a2005a27SJames Collins
15953a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15969cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1597a2005a27SJames Collins                    $preview[0]->innertext = $content;
1598a2005a27SJames Collins                }
1599a2005a27SJames Collins
1600a2005a27SJames Collins                $str = $html->save();
1601a2005a27SJames Collins                $html->clear();
1602a2005a27SJames Collins                unset($html);
1603a2005a27SJames Collins            } else {
1604a2005a27SJames Collins                $str = $content;
1605a2005a27SJames Collins            }
16069cff245bSJames Collins        }//end if
1607ab45ba71SJames Collins
1608ab45ba71SJames Collins        return $str;
1609ab45ba71SJames Collins    }
161047161538SJames Collins
1611c165b184SJames Collins    /**
1612a8eebd82SJames Collins     * Parse HTML for theme
1613c165b184SJames Collins     *
16149cff245bSJames Collins     * @param   string $content HTML content to parse.
1615a8eebd82SJames Collins     * @return  string          Parsed content
1616c165b184SJames Collins     */
16179cff245bSJames Collins    public function parseContent(string $content)
161810b40067Snomadjimbob    {
1619ab45ba71SJames Collins        global $INPUT, $ACT;
1620ab45ba71SJames Collins
1621a8eebd82SJames Collins        // Add Mikio Section titles
16223a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
16239cff245bSJames Collins            $admin_sections = [
1624ab45ba71SJames Collins                // Section      Insert Before                 Icon
16259cff245bSJames Collins                'navbar'        => ['navbarUseTitleIcon',      ''],
16269cff245bSJames Collins                'search'        => ['searchButton',            ''],
16279cff245bSJames Collins                'hero'          => ['heroTitle',               ''],
16289cff245bSJames Collins                'tags'          => ['tagsConsolidate',         ''],
16299cff245bSJames Collins                'breadcrumb'    => ['breadcrumbHideHome',      ''],
16309cff245bSJames Collins                'youarehere'    => ['youarehereHideHome',      ''],
16319cff245bSJames Collins                'sidebar'       => ['sidebarShowLeft',         ''],
16329cff245bSJames Collins                'toc'           => ['tocFull',                 ''],
16339cff245bSJames Collins                'pagetools'     => ['pageToolsFloating',       ''],
16349cff245bSJames Collins                'footer'        => ['footerCustomMenuText',    ''],
16359cff245bSJames Collins                'license'       => ['licenseType',             ''],
16369cff245bSJames Collins                'acl'           => ['includePageUseACL',       ''],
16379cff245bSJames Collins                'sticky'        => ['stickyTopHeader',         ''],
16389cff245bSJames Collins            ];
1639ab45ba71SJames Collins
1640ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
1641ab45ba71SJames Collins                $search = $items[0];
1642ab45ba71SJames Collins                $icon   = $items[1];
1643ab45ba71SJames Collins
164410b40067Snomadjimbob                $content = preg_replace(
1645adf52ebbSJames Collins                    '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/',
16469cff245bSJames Collins                    '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) .
16479cff245bSJames Collins                        tpl_getLang('config_' . $section) .
16489cff245bSJames Collins                        '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' .
16499cff245bSJames Collins                        $search . '</span>',
165010b40067Snomadjimbob                    $content
165110b40067Snomadjimbob                );
1652ab45ba71SJames Collins            }
1653bb5a3dd1SJames Collins        } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) {
1654ad182e6dSnomadjimbob            $mikioPluginMissing = true;
1655ad182e6dSnomadjimbob            /* Hide plugin fields if not installed */
16569ffe9161Snomadjimbob            if (plugin_load('action', 'mikioplugin') !== null) {
1657ad182e6dSnomadjimbob                $mikioPluginMissing = false;
1658ad182e6dSnomadjimbob            }
1659ad182e6dSnomadjimbob
1660cee81679SJames Collins            $style_headers = [
1661f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__text_'],
1662f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__code_'],
1663f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__control_'],
1664f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__topheader_'],
1665f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__navbar_'],
1666f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar_'],
1667f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__tag_background_color_'],
1668f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb_'],
1669f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__hero_'],
1670f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__sidebar_'],
1671f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__content_'],
1672f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__toc_'],
1673f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__pagetools_'],
1674f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__footer_'],
1675f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__table_'],
1676f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__dropdown_'],
1677f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__section_edit_'],
1678f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__tree_'],
1679f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__tab_'],
1680ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin', 'starts_with' => '__plugin_', 'heading' => 'h2',
16819ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
16829ffe9161Snomadjimbob                ],
1683ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_primary_', 'hidden' => $mikioPluginMissing],
1684ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_secondary_',
16859ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
16869ffe9161Snomadjimbob                ],
1687ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_success_', 'hidden' => $mikioPluginMissing],
1688ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_danger_', 'hidden' => $mikioPluginMissing],
1689ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_warning_', 'hidden' => $mikioPluginMissing],
1690ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_info_', 'hidden' => $mikioPluginMissing],
1691ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_light_', 'hidden' => $mikioPluginMissing],
1692ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_dark_', 'hidden' => $mikioPluginMissing],
1693ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_link_', 'hidden' => $mikioPluginMissing],
1694ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_carousel_', 'hidden' => $mikioPluginMissing],
1695ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_steps_', 'hidden' => $mikioPluginMissing],
1696ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_tabgroup_', 'hidden' => $mikioPluginMissing],
1697ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_tooltip_', 'hidden' => $mikioPluginMissing],
1698cee81679SJames Collins                ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'],
1699f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__darkmode_text_'],
1700f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__darkmode_code_'],
1701f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__darkmode_control_'],
1702f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__darkmode_topheader_'],
1703f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar_'],
1704f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar_'],
1705f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color_'],
1706f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb_'],
1707f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__darkmode_hero_'],
1708f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar_'],
1709f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__darkmode_content_'],
1710f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__darkmode_toc_'],
1711f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools_'],
1712f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__darkmode_footer_'],
1713f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__darkmode_table_'],
1714f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown_'],
1715f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit_'],
1716f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__darkmode_tree_'],
1717f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__darkmode_tab_'],
1718ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin (Dark mode)', 'starts_with' => '__plugin_darkmode_', 'heading' => 'h2',
17199ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17209ffe9161Snomadjimbob                ],
1721ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_darkmode_primary_',
17229ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17239ffe9161Snomadjimbob                ],
1724ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_darkmode_secondary_',
17259ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17269ffe9161Snomadjimbob                ],
1727ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_darkmode_success_',
17289ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17299ffe9161Snomadjimbob                ],
1730ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_darkmode_danger_',
17319ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17329ffe9161Snomadjimbob                ],
1733ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_darkmode_warning_',
17349ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17359ffe9161Snomadjimbob                ],
1736ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_darkmode_info_',
17379ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17389ffe9161Snomadjimbob                ],
1739ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_darkmode_light_',
17409ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17419ffe9161Snomadjimbob                ],
1742ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_darkmode_dark_',
17439ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17449ffe9161Snomadjimbob                ],
1745ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_darkmode_link_',
17469ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17479ffe9161Snomadjimbob                ],
1748ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_darkmode_carousel_',
17499ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17509ffe9161Snomadjimbob                ],
1751ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_darkmode_steps_', 'hidden' => $mikioPluginMissing],
1752ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_darkmode_tabgroup_',
17539ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17549ffe9161Snomadjimbob                ],
1755ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_darkmode_tooltip_', 'hidden' => $mikioPluginMissing],
1756cee81679SJames Collins            ];
1757cee81679SJames Collins
1758cee81679SJames Collins            foreach ($style_headers as $header) {
1759cee81679SJames Collins                if (array_key_exists('heading', $header) === false) {
1760cee81679SJames Collins                    $header['heading'] = 'h3';
1761cee81679SJames Collins                }
1762cee81679SJames Collins
1763ad182e6dSnomadjimbob                if (array_key_exists('hidden', $header) === false) {
1764ad182e6dSnomadjimbob                    $header['hidden'] = false;
1765ad182e6dSnomadjimbob                }
1766ad182e6dSnomadjimbob
17671244e3ceSJames Collins                $content = preg_replace(
1768f65a4e5eSJames Collins                    '/(<tr>\s*<td>\s*<label for="tpl__' . $header['starts_with'] . '.+?<\/tr>)/s',
17699ffe9161Snomadjimbob                    '</tbody></table><' . $header['heading'] . ' style="display:' .
17709ffe9161Snomadjimbob                    ($header['hidden'] === true ? 'none' : 'block') . '">' .
17719ffe9161Snomadjimbob                    $header['title'] . '</' . $header['heading'] . '>
1772ad182e6dSnomadjimbob                    <table style="display:' . ($header['hidden'] === true ? 'none' : 'table') . '"><tbody>$1',
17731244e3ceSJames Collins                    $content,
17741244e3ceSJames Collins                    1
17751244e3ceSJames Collins                );
1776cee81679SJames Collins            }
1777f65a4e5eSJames Collins
1778f65a4e5eSJames Collins            $content = preg_replace('/type="color"/', 'type="text"', $content);
1779bb5a3dd1SJames Collins        }//end if
1780ab45ba71SJames Collins
17813a385f2cSJames Collins        if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
1782a8eebd82SJames Collins            $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content);
1783a8eebd82SJames Collins        }
1784ab45ba71SJames Collins
1785a8eebd82SJames Collins        // Page Revisions - Table Fix
17869cff245bSJames Collins        if (strpos($content, 'id="page__revisions"') !== false) {
17879cff245bSJames Collins            $content = preg_replace(
17889cff245bSJames Collins                '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/',
17899cff245bSJames Collins                '<span>$1</span>',
17909cff245bSJames Collins                $content
17919cff245bSJames Collins            );
1792a8eebd82SJames Collins        }
1793ab45ba71SJames Collins
17949cff245bSJames Collins        $html = new \simple_html_dom();
1795bc1032d9SJames Collins        $html->stripRNAttrValues = false;
1796c165b184SJames Collins        $html->load($content, true, false);
1797c165b184SJames Collins
17989cff245bSJames Collins        if ($html === false) {
17999cff245bSJames Collins            return $content;
18009cff245bSJames Collins        }
1801ab45ba71SJames Collins
1802ab45ba71SJames Collins        /* Buttons */
1803ab45ba71SJames Collins        foreach ($html->find('#config__manager button') as $node) {
1804ab45ba71SJames Collins            $c = explode(' ', $node->class);
18059cff245bSJames Collins            if (in_array('mikio-button', $c) === false) {
18069cff245bSJames Collins                $c[] = 'mikio-button';
18079cff245bSJames Collins            }
1808ab45ba71SJames Collins            $node->class = implode(' ', $c);
1809c165b184SJames Collins        }
1810c165b184SJames Collins
1811ab45ba71SJames Collins
1812ab45ba71SJames Collins        /* Buttons - Primary */
1813ab45ba71SJames Collins        foreach ($html->find('#config__manager [type=submit]') as $node) {
1814ab45ba71SJames Collins            $c = explode(' ', $node->class);
18159cff245bSJames Collins            if (in_array('mikio-primary', $c) === false) {
18169cff245bSJames Collins                $c[] = 'mikio-primary';
18179cff245bSJames Collins            }
1818ab45ba71SJames Collins            $node->class = implode(' ', $c);
1819ab45ba71SJames Collins        }
1820ab45ba71SJames Collins
1821a8eebd82SJames Collins        /* Hide page title if hero is enabled */
18229cff245bSJames Collins        if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
18231785fc73SJames Collins            $pageTitle = $this->parsePageTitle();
182447161538SJames Collins
182547161538SJames Collins            foreach ($html->find('h1,h2,h3,h4') as $elm) {
18269cff245bSJames Collins                if ($elm->innertext === $pageTitle) {
1827a8eebd82SJames Collins                    // $elm->innertext = '';
1828a8eebd82SJames Collins                    $elm->setAttribute('style', 'display:none');
1829a8eebd82SJames Collins
183047161538SJames Collins                    break;
183147161538SJames Collins                }
183247161538SJames Collins            }
183347161538SJames Collins        }
1834c165b184SJames Collins
1835a8eebd82SJames Collins        /* Hero subtitle */
18362b4583abSJames Collins        foreach ($html->find('p') as $elm) {
18372b4583abSJames Collins            $i = stripos($elm->innertext, '~~hero-subtitle');
18382b4583abSJames Collins            if ($i !== false) {
18399cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
18402b4583abSJames Collins                if ($j !== false) {
18419cff245bSJames Collins                    if ($j > ($i + 16)) {
18429cff245bSJames Collins                        $subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16));
1843a8eebd82SJames Collins                        $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
1844a8eebd82SJames Collins
1845a8eebd82SJames Collins                        // $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2);
1846a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext);
18472b4583abSJames Collins                    }
18482b4583abSJames Collins
18492b4583abSJames Collins                    break;
18502b4583abSJames Collins                }
18512b4583abSJames Collins            }
18522b4583abSJames Collins        }
18532b4583abSJames Collins
1854a8eebd82SJames Collins        /* Hero image */
1855a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1856a8eebd82SJames Collins            $image = '';
1857a8eebd82SJames Collins            preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches);
1858a8eebd82SJames Collins            if (count($matches) > 0) {
1859a8eebd82SJames Collins                preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches);
1860a8eebd82SJames Collins                if (count($imageTagMatches) > 0) {
1861a8eebd82SJames Collins                    $image = $imageTagMatches[1];
1862a8eebd82SJames Collins                } else {
1863a8eebd82SJames Collins                    preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches);
1864a8eebd82SJames Collins                    if (count($imageTagMatches) > 0) {
1865a8eebd82SJames Collins                        $image = $imageTagMatches[1];
1866a8eebd82SJames Collins                    } else {
1867a8eebd82SJames Collins                        $image = strip_tags($matches[1]);
18689cff245bSJames Collins                        if (stripos($image, ':') === false) {
18699cff245bSJames Collins                            $image = str_replace(['{', '}'], '', $image);
1870a8eebd82SJames Collins                            $i = stripos($image, '?');
18719cff245bSJames Collins                            if ($i !== false) {
1872a8eebd82SJames Collins                                $image = substr($image, 0, $i);
1873c165b184SJames Collins                            }
1874c165b184SJames Collins
1875a8eebd82SJames Collins                            $image = ml($image, '', true, '', false);
1876ab45ba71SJames Collins                        }
1877ab45ba71SJames Collins                    }
1878ab45ba71SJames Collins                }
1879ab45ba71SJames Collins
1880a8eebd82SJames Collins                $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
1881a8eebd82SJames Collins
1882a8eebd82SJames Collins                $elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext);
18839cff245bSJames Collins            }//end if
18849cff245bSJames Collins        }//end foreach
1885ab45ba71SJames Collins
18869cff245bSJames Collins        /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
18879cff245bSJames Collins        [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
1888a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1889a8eebd82SJames Collins            $i = stripos($elm->innertext, '~~hero-colors');
1890a8eebd82SJames Collins            if ($i !== false) {
18919cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
1892a8eebd82SJames Collins                if ($j !== false) {
18939cff245bSJames Collins                    if ($j > ($i + 14)) {
18949cff245bSJames Collins                        $color = substr($elm->innertext, ($i + 14), ($j - $i - 14));
1895a8eebd82SJames Collins                        $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')';
1896ab45ba71SJames Collins
1897a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext);
1898ab45ba71SJames Collins                    }
1899ab45ba71SJames Collins
1900a8eebd82SJames Collins                    break;
1901ab45ba71SJames Collins                }
1902ab45ba71SJames Collins            }
1903ab45ba71SJames Collins        }
1904ab45ba71SJames Collins
190596ec8e1eSJames Collins        /* Hide parts - ~~hide-parts [parts]~~  */
190696ec8e1eSJames Collins        foreach ($html->find('p') as $elm) {
190796ec8e1eSJames Collins            $i = stripos($elm->innertext, '~~hide-parts');
190896ec8e1eSJames Collins            if ($i !== false) {
19099cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
191096ec8e1eSJames Collins                if ($j !== false) {
19119cff245bSJames Collins                    if ($j > ($i + 13)) {
19129cff245bSJames Collins                        $parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13)));
191396ec8e1eSJames Collins                        $script = '';
191496ec8e1eSJames Collins
191596ec8e1eSJames Collins                        foreach ($parts as $part) {
191696ec8e1eSJames Collins                            // $part = trim($part);
191796ec8e1eSJames Collins                            if (strlen($part) > 0) {
191896ec8e1eSJames Collins                                $script .= 'mikio.hidePart(\'' . $part . '\');';
191996ec8e1eSJames Collins                            }
192096ec8e1eSJames Collins                        }
192196ec8e1eSJames Collins
192296ec8e1eSJames Collins                        if (strlen($script) > 0) {
192396ec8e1eSJames Collins                            $this->footerScript['hide-parts'] = $script;
192496ec8e1eSJames Collins                        }
192596ec8e1eSJames Collins
192696ec8e1eSJames Collins                        $elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext);
192796ec8e1eSJames Collins                    }
192896ec8e1eSJames Collins
192996ec8e1eSJames Collins                    break;
19309cff245bSJames Collins                }//end if
19319cff245bSJames Collins            }//end if
19329cff245bSJames Collins        }//end foreach
193396ec8e1eSJames Collins
193496ec8e1eSJames Collins
1935a8eebd82SJames Collins        /* Page Tags (tag plugin) */
19369cff245bSJames Collins        if ($this->getConf('tagsConsolidate') === true) {
1937a8eebd82SJames Collins            $tags = '';
1938a8eebd82SJames Collins            foreach ($html->find('div.tags a') as $elm) {
1939a8eebd82SJames Collins                $tags .= $elm->outertext;
1940a8eebd82SJames Collins            }
1941a8eebd82SJames Collins
1942a8eebd82SJames Collins            foreach ($html->find('div.tags') as $elm) {
1943a8eebd82SJames Collins                $elm->innertext = '';
1944a8eebd82SJames Collins                $elm->setAttribute('style', 'display:none');
1945a8eebd82SJames Collins            }
1946a8eebd82SJames Collins
19473a385f2cSJames Collins            if (empty($tags) === false) {
1948a8eebd82SJames Collins                $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
1949a8eebd82SJames Collins            }
1950ab45ba71SJames Collins        }
1951ab45ba71SJames Collins
1952ab45ba71SJames Collins        // Configuration Manager
19533a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
1954ab45ba71SJames Collins            // Additional save buttons
1955ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
1956ab45ba71SJames Collins                $saveButtons = '';
1957ab45ba71SJames Collins
1958ab45ba71SJames Collins                foreach ($cm->find('p') as $elm) {
1959ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
1960a8eebd82SJames Collins                    $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons);
1961ab45ba71SJames Collins                    $elm->outertext = '';
1962ab45ba71SJames Collins                }
1963ab45ba71SJames Collins
1964ab45ba71SJames Collins                foreach ($cm->find('fieldset') as $elm) {
1965ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
1966ab45ba71SJames Collins                }
1967ab45ba71SJames Collins            }
1968ab45ba71SJames Collins        }
1969ab45ba71SJames Collins
1970ab45ba71SJames Collins        $content = $html->save();
1971c165b184SJames Collins        $html->clear();
1972c165b184SJames Collins        unset($html);
1973c165b184SJames Collins
1974c165b184SJames Collins        return $content;
1975c165b184SJames Collins    }
19762b4583abSJames Collins
19772b4583abSJames Collins
1978a8eebd82SJames Collins    /**
1979a8eebd82SJames Collins     * Get DokuWiki namespace/page/URI as link
1980a8eebd82SJames Collins     *
19819cff245bSJames Collins     * @param   string $str String to parse.
19829cff245bSJames Collins     * @return  string      parsed URI
1983a8eebd82SJames Collins     */
19849cff245bSJames Collins    public function getLink(string $str)
198510b40067Snomadjimbob    {
19862b4583abSJames Collins        $i = strpos($str, '://');
19879cff245bSJames Collins        if ($i !== false) {
19889cff245bSJames Collins            return $str;
19899cff245bSJames Collins        }
19902b4583abSJames Collins
19912b4583abSJames Collins        return wl($str);
19922b4583abSJames Collins    }
1993ab45ba71SJames Collins
1994ab45ba71SJames Collins
1995a8eebd82SJames Collins    /**
1996a8eebd82SJames Collins     * Check if the user can edit current namespace/page
1997a8eebd82SJames Collins     *
1998a8eebd82SJames Collins     * @return  boolean  user can edit
1999a8eebd82SJames Collins     */
200010b40067Snomadjimbob    public function userCanEdit()
200110b40067Snomadjimbob    {
2002ab45ba71SJames Collins        global $INFO;
2003ab45ba71SJames Collins        global $ID;
2004ab45ba71SJames Collins
2005ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
20069cff245bSJames Collins        if (@file_exists($wiki_file) === false) {
20079cff245bSJames Collins            return true;
20089cff245bSJames Collins        }
20099cff245bSJames Collins        if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
20109cff245bSJames Collins            return true;
20119cff245bSJames Collins        }
2012a8eebd82SJames Collins        // $meta_file = metaFN($ID, '.meta');
20139cff245bSJames Collins        if ($INFO['meta']['user'] === false) {
20149cff245bSJames Collins            return true;
20159cff245bSJames Collins        }
20169cff245bSJames Collins        if ($INFO['client'] === $INFO['meta']['user']) {
20179cff245bSJames Collins            return true;
20189cff245bSJames Collins        }
2019ab45ba71SJames Collins
2020ab45ba71SJames Collins        return false;
2021c165b184SJames Collins    }
202247161538SJames Collins
202347161538SJames Collins
2024a8eebd82SJames Collins    /**
2025a8eebd82SJames Collins     * Search for and return the uri of a media file
2026a8eebd82SJames Collins     *
20279cff245bSJames Collins     * @param string  $image           Image name to search for (without extension).
20289cff245bSJames Collins     * @param boolean $searchCurrentNS Search the current namespace.
20299cff245bSJames Collins     * @param boolean $propagate       Propagate search through the namespace.
20309cff245bSJames Collins     * @return string                  URI of the found media file
2031a8eebd82SJames Collins     */
20329cff245bSJames Collins    public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
203310b40067Snomadjimbob    {
2034ab45ba71SJames Collins        global $INFO;
2035a8eebd82SJames Collins
20369cff245bSJames Collins        $ext = ['png', 'jpg', 'gif', 'svg'];
2037ab45ba71SJames Collins
20389cff245bSJames Collins        if ($searchCurrentNS === true) {
20399cff245bSJames Collins            $prefix[] = ':' . $INFO['namespace'] . ':';
20409cff245bSJames Collins        }
20419cff245bSJames Collins        if ($propagate === true) {
2042ab45ba71SJames Collins            $prefix[] = ':';
2043ab45ba71SJames Collins            $prefix[] = ':wiki:';
2044a8eebd82SJames Collins        }
2045ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
20463a385f2cSJames Collins        if (empty($theme) === false) {
20479cff245bSJames Collins            $prefix[] = 'themes/' . $theme . '/images/';
20489cff245bSJames Collins        }
2049ab45ba71SJames Collins        $prefix[] = 'images/';
2050ab45ba71SJames Collins
20519cff245bSJames Collins        $search = [];
2052ab45ba71SJames Collins        foreach ($prefix as $pitem) {
2053ab45ba71SJames Collins            foreach ($ext as $eitem) {
2054ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
2055ab45ba71SJames Collins            }
2056ab45ba71SJames Collins        }
2057ab45ba71SJames Collins
2058ab45ba71SJames Collins        $img = '';
2059ab45ba71SJames Collins        $file = '';
2060ab45ba71SJames Collins        $url = '';
2061ab45ba71SJames Collins        $ismedia = false;
2062ab45ba71SJames Collins        $found = false;
2063ab45ba71SJames Collins
2064ab45ba71SJames Collins        foreach ($search as $img) {
20653a385f2cSJames Collins            if (strcasecmp(substr($img, 0, 1), ':') === 0) {
2066ab45ba71SJames Collins                $file    = mediaFN($img);
2067ab45ba71SJames Collins                $ismedia = true;
2068ab45ba71SJames Collins            } else {
2069ab45ba71SJames Collins                $file    = tpl_incdir() . $img;
2070ab45ba71SJames Collins                $ismedia = false;
2071ab45ba71SJames Collins            }
2072ab45ba71SJames Collins
20739cff245bSJames Collins            if (file_exists($file) === true) {
2074ab45ba71SJames Collins                $found = true;
2075ab45ba71SJames Collins                break;
2076ab45ba71SJames Collins            }
2077ab45ba71SJames Collins        }
2078ab45ba71SJames Collins
20799cff245bSJames Collins        if ($found === false) {
20809cff245bSJames Collins            return false;
20819cff245bSJames Collins        }
2082ab45ba71SJames Collins
20839cff245bSJames Collins        if ($ismedia === true) {
2084ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
2085ab45ba71SJames Collins        } else {
2086ab45ba71SJames Collins            $url = tpl_basedir() . $img;
2087ab45ba71SJames Collins        }
2088ab45ba71SJames Collins
2089ab45ba71SJames Collins        return $url;
2090ab45ba71SJames Collins    }
2091ab45ba71SJames Collins
2092a8eebd82SJames Collins
2093a8eebd82SJames Collins    /**
2094ab45ba71SJames Collins     * Print or return the page title
2095ab45ba71SJames Collins     *
20969cff245bSJames Collins     * @param string $page Page id or empty string for current page.
2097ab45ba71SJames Collins     * @return string      generated content
2098ab45ba71SJames Collins     */
20999cff245bSJames Collins    public function getPageTitle(string $page = '')
210010b40067Snomadjimbob    {
2101ab45ba71SJames Collins        global $ID, $conf;
2102ab45ba71SJames Collins
2103ab45ba71SJames Collins        $html = '';
2104ab45ba71SJames Collins
21053a385f2cSJames Collins        if (empty($page) === true) {
21069cff245bSJames Collins            $page = $ID;
21079cff245bSJames Collins        }
2108ab45ba71SJames Collins
2109ab45ba71SJames Collins        $html = p_get_first_heading($page);
2110ab45ba71SJames Collins        $html = strip_tags($html);
2111ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
2112ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
2113ab45ba71SJames Collins        $html = trim($html);
2114ab45ba71SJames Collins
2115ab45ba71SJames Collins        return $html;
2116ab45ba71SJames Collins    }
2117a8eebd82SJames Collins
2118a8eebd82SJames Collins
2119a8eebd82SJames Collins    /**
2120a8eebd82SJames Collins     * Return inline theme icon
2121a8eebd82SJames Collins     *
21229cff245bSJames Collins     * @param   string $type  Icon to retreive.
21239e41d878SJames Collins     * @param   string $class Classname to insert.
21249cff245bSJames Collins     * @return  string        HTML icon content
2125a8eebd82SJames Collins     */
21269e41d878SJames Collins    public function mikioInlineIcon(string $type, string $class = "")
212710b40067Snomadjimbob    {
21289e41d878SJames Collins        if (is_array($class) === true) {
21299e41d878SJames Collins            $class = explode(' ', $class);
21309e41d878SJames Collins        }
21319e41d878SJames Collins
21329e41d878SJames Collins        if (strlen($class) > 0) {
21339e41d878SJames Collins            $class = ' ' . $class;
21349e41d878SJames Collins        }
21359e41d878SJames Collins
2136a8eebd82SJames Collins        switch ($type) {
2137a8eebd82SJames Collins            case 'wrench':
2138906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792
2139906e1a13SJames 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,
2140906e1a13SJames 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,
2141906e1a13SJames 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,
2142906e1a13SJames 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
2143906e1a13SJames 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,
2144906e1a13SJames 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>';
2145a8eebd82SJames Collins            case 'file':
2146906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2147906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991">
2148906e1a13SJames 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
2149906e1a13SJames 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
2150906e1a13SJames 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"
21519cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
2152a8eebd82SJames Collins            case 'gear':
2153906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2154906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027">
2155906e1a13SJames 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
2156906e1a13SJames 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
2157906e1a13SJames 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
2158906e1a13SJames 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
2159906e1a13SJames 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
2160906e1a13SJames 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,
2161906e1a13SJames 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
2162906e1a13SJames 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
2163906e1a13SJames 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" />
2164906e1a13SJames Collins</g></svg>';
2165a8eebd82SJames Collins            case 'user':
2166906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2167906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M
2168906e1a13SJames 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
2169906e1a13SJames 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,
2170906e1a13SJames 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
2171906e1a13SJames 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
2172906e1a13SJames 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,
2173906e1a13SJames Collins1408 863,1408 975.5,1295.5 1088,1183 1088,1024 z"/></g></svg>';
2174a8eebd82SJames Collins            case 'search':
21759e41d878SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
21769cff245bSJames 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
21779cff245bSJames 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
21789cff245bSJames 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
21799cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>';
2180a8eebd82SJames Collins            case 'home':
2181906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2182906e1a13SJames CollinsviewBox="0 -256 1792 1792" aria-hidden="true" style="fill:currentColor"><g
2183906e1a13SJames 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
2184906e1a13SJames 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
2185906e1a13SJames 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
2186906e1a13SJames 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,
2187906e1a13SJames 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"
21889cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
21899e41d878SJames Collins            case 'sun':
2190906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2191906e1a13SJames 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
2192906e1a13SJames 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
2193906e1a13SJames 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
2194906e1a13SJames 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
2195906e1a13SJames Collins0 0 1-.707.707z" /></svg>';
21969e41d878SJames Collins            case 'moon':
2197906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2198906e1a13SJames 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
2199906e1a13SJames 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
2200906e1a13SJames 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
2201906e1a13SJames 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
2202906e1a13SJames Collins0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>';
2203*34d5f19aSJames Collins            case 'sunmoon':
2204*34d5f19aSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" style="fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10" viewBox="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 x1="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" y2="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,2.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>';
2205f65a4e5eSJames Collins            case 'hamburger':
2206f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
2207f65a4e5eSJames 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
2208f65a4e5eSJames 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
2209f65a4e5eSJames 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
2210f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16z"/></svg>';
2211f65a4e5eSJames Collins            case 'down-arrow':
2212f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
2213f65a4e5eSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M16.003 18.626l7.081-7.081L25 13.46l-8.997 8.998-9.003-9
2214f65a4e5eSJames Collins1.917-1.916z"/></svg>';
22159cff245bSJames Collins        }//end switch
2216ab45ba71SJames Collins
2217a8eebd82SJames Collins        return '';
2218a8eebd82SJames Collins    }
2219ab45ba71SJames Collins
2220a8eebd82SJames Collins    /**
2221a8eebd82SJames Collins     * Finalize theme
22229cff245bSJames Collins     *
22239cff245bSJames Collins     * @return void
2224a8eebd82SJames Collins     */
222510b40067Snomadjimbob    public function finalize()
222610b40067Snomadjimbob    {
2227a8eebd82SJames Collins    }
22281785fc73SJames Collins
22291785fc73SJames Collins    /**
22301785fc73SJames Collins     * Show Messages
22319cff245bSJames Collins     *
22329cff245bSJames Collins     * @return void
22331785fc73SJames Collins     */
223410b40067Snomadjimbob    public function showMessages()
223510b40067Snomadjimbob    {
22361785fc73SJames Collins        global $ACT;
22371785fc73SJames Collins
22389cff245bSJames Collins        if ($this->lessIgnored === true) {
22399cff245bSJames Collins            msg(
22409cff245bSJames Collins                'useLESS is enabled on the Mikio template, however is not supported on this server',
22419cff245bSJames Collins                2,
22429cff245bSJames Collins                '',
22439cff245bSJames Collins                '',
22449cff245bSJames Collins                MSG_ADMINS_ONLY
22459cff245bSJames Collins            );
2246a8df40efSJames Collins        }
2247a8df40efSJames Collins
22481785fc73SJames Collins        $show = $this->getConf('showNotifications');
22493a385f2cSJames Collins        if (
22503a385f2cSJames Collins            strcasecmp($show, 'always') === 0 ||
22513a385f2cSJames Collins            (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
22523a385f2cSJames Collins        ) {
22531785fc73SJames Collins            global $MSG, $MSG_shown;
22541785fc73SJames Collins
22559cff245bSJames Collins            if (isset($MSG) === false) {
22561785fc73SJames Collins                return;
22571785fc73SJames Collins            }
22581785fc73SJames Collins
22599cff245bSJames Collins            if (isset($MSG_shown) === false) {
22609cff245bSJames Collins                $MSG_shown = [];
2261a8df40efSJames Collins            }
22621785fc73SJames Collins
22631785fc73SJames Collins            foreach ($MSG as $msg) {
22641785fc73SJames Collins                $hash = md5($msg['msg']);
22659cff245bSJames Collins                if (isset($MSG_shown[$hash]) === true) {
22661785fc73SJames Collins                    continue;
22671785fc73SJames Collins                }
22681785fc73SJames Collins                // skip double messages
22691785fc73SJames Collins
22709cff245bSJames Collins                if (info_msg_allowed($msg) === true) {
22719cff245bSJames Collins                    echo '<div class="' . $msg['lvl'] . '">';
22729cff245bSJames Collins                    echo $msg['msg'];
22739cff245bSJames Collins                    echo '</div>';
22741785fc73SJames Collins                }
22751785fc73SJames Collins
2276a8df40efSJames Collins                $MSG_shown[$hash] = true;
22771785fc73SJames Collins            }
22781785fc73SJames Collins
22791785fc73SJames Collins            unset($GLOBALS['MSG']);
22809cff245bSJames Collins        }//end if
22811785fc73SJames Collins    }
22827ac0a6efSJames Collins
22837ac0a6efSJames Collins    /**
22847ac0a6efSJames Collins     * Dokuwiki version
22857ac0a6efSJames Collins     *
22867ac0a6efSJames Collins     * @return  string        the dw version name
22877ac0a6efSJames Collins     */
22889cff245bSJames Collins    public function dwVersion()
22899cff245bSJames Collins    {
22909cff245bSJames Collins        if (function_exists('getVersionData') === true) {
22917ac0a6efSJames Collins            $version_data = getVersionData();
22929cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
22937ac0a6efSJames Collins                $version_items = explode(' ', $version_data['date']);
22947ac0a6efSJames Collins                if (count($version_items) >= 2) {
22957ac0a6efSJames Collins                    return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
22967ac0a6efSJames Collins                }
22977ac0a6efSJames Collins            }
22987ac0a6efSJames Collins        }
22997ac0a6efSJames Collins
23007ac0a6efSJames Collins        return 'unknown';
23017ac0a6efSJames Collins    }
2302e4c4fb13SJames Collins
2303e4c4fb13SJames Collins    /**
2304e4c4fb13SJames Collins     * Dokuwiki version number
2305e4c4fb13SJames Collins     *
2306e4c4fb13SJames Collins     * @return  string        the dw version date converted to integer
2307e4c4fb13SJames Collins     */
23089cff245bSJames Collins    public function dwVersionNumber()
23099cff245bSJames Collins    {
23109cff245bSJames Collins        if (function_exists('getVersionData') === true) {
2311e4c4fb13SJames Collins            $version_data = getVersionData();
23129cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
2313e4c4fb13SJames Collins                $version_items = explode(' ', $version_data['date']);
2314e4c4fb13SJames Collins                if (count($version_items) >= 1) {
2315e4c4fb13SJames Collins                    return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
2316e4c4fb13SJames Collins                }
2317e4c4fb13SJames Collins            }
2318e4c4fb13SJames Collins        }
2319e4c4fb13SJames Collins
2320e4c4fb13SJames Collins        return 0;
2321e4c4fb13SJames Collins    }
2322a8eebd82SJames Collins}
2323ab45ba71SJames Collins
2324ab45ba71SJames Collinsglobal $TEMPLATE;
232547161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
2326