xref: /template/mikio/mikio.php (revision 9ffe91610ef1542c3386e654e7c5d1484c4be469)
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 */
152*9ffe9161Snomadjimbob        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'],
3323a385f2cSJames Collins            ['keys' => ['youarehereShowLast'],              'type' => 'int'],
3333a385f2cSJames Collins
3343a385f2cSJames Collins            ['keys' => ['iconTag'],                         'type' => 'string'],
3353a385f2cSJames Collins            ['keys' => ['customTheme'],                     'type' => 'string'],
3363a385f2cSJames Collins            ['keys' => ['navbarCustomMenuText'],            'type' => 'string'],
3373a385f2cSJames Collins            ['keys' => ['breadcrumbPrefixText'],            'type' => 'string'],
3383a385f2cSJames Collins            ['keys' => ['breadcrumbSepText'],               'type' => 'string'],
3393a385f2cSJames Collins            ['keys' => ['youareherePrefixText'],            'type' => 'string'],
3403a385f2cSJames Collins            ['keys' => ['youarehereSepText'],               'type' => 'string'],
3413a385f2cSJames Collins            ['keys' => ['footerCustomMenuText'],            'type' => 'string'],
3423a385f2cSJames Collins            ['keys' => ['brandURLGuest'],                   'type' => 'string'],
3433a385f2cSJames Collins            ['keys' => ['brandURLUser'],                    'type' => 'string'],
3443a385f2cSJames Collins
3453a385f2cSJames Collins            ['keys' => ['useLESS'],                         'type' => 'less'],
3463a385f2cSJames Collins        ];
3473a385f2cSJames Collins
3483a385f2cSJames Collins        foreach ($data as $row) {
3493a385f2cSJames Collins            // does not check case....
3503a385f2cSJames Collins            if (in_array($key, $row['keys']) === true) {
35195372bffSJames Collins                if (array_key_exists('type', $row) === true) {
3523a385f2cSJames Collins                    switch ($row['type']) {
3533a385f2cSJames Collins                        case 'bool':
3543a385f2cSJames Collins                            return (bool) $value;
3553a385f2cSJames Collins                        case 'int':
3563a385f2cSJames Collins                            return (int) $value;
3573a385f2cSJames Collins                        case 'string':
3583a385f2cSJames Collins                            return $value;
3593a385f2cSJames Collins                        case 'less':
36029118ed7SJames Collins                            $value = (bool) $value;
361a8df40efSJames Collins                            $lessAvailable = true;
362a8df40efSJames Collins
363a8df40efSJames Collins                            // check for less library
364a8df40efSJames Collins                            $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php';
3659cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
366a8df40efSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3679cff245bSJames Collins                            }
3689cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
369a8df40efSJames Collins                                $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3709cff245bSJames Collins                            }
3719cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
3729cff245bSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] .
3739cff245bSJames Collins                                    '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3749cff245bSJames Collins                            }
3759cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
376a8df40efSJames Collins                                $lessAvailable = false;
377a8df40efSJames Collins                            }
378a8df40efSJames Collins
379a8df40efSJames Collins                            // check for ctype extensions
3809cff245bSJames Collins                            if (function_exists('ctype_digit') === false) {
381a8df40efSJames Collins                                $lessAvailable = false;
382a8df40efSJames Collins                            }
383a8df40efSJames Collins
3849cff245bSJames Collins                            if ($value === true && $lessAvailable === false) {
385a8df40efSJames Collins                                $this->lessIgnored = true;
38629118ed7SJames Collins                                $value = false;
38729118ed7SJames Collins                            }
3883a385f2cSJames Collins
3893a385f2cSJames Collins                            return $value;
3909cff245bSJames Collins                    }//end switch
3913a385f2cSJames Collins                }//end if
3923a385f2cSJames Collins
3933a385f2cSJames Collins                if (in_array($value, $row['values']) === true) {
3943a385f2cSJames Collins                    return $value;
3953a385f2cSJames Collins                }
3963a385f2cSJames Collins
3973a385f2cSJames Collins                if (array_key_exists('default', $row) === true) {
3983a385f2cSJames Collins                    if (is_array($row['default']) === true) {
3993a385f2cSJames Collins                        if (array_key_exists($key, $row['default']) === true) {
4003a385f2cSJames Collins                            return $row['default'][$key];
4013a385f2cSJames Collins                        }
4023a385f2cSJames Collins                    } else {
4033a385f2cSJames Collins                        return $row['default'];
4043a385f2cSJames Collins                    }
4053a385f2cSJames Collins                }
4063a385f2cSJames Collins
4073a385f2cSJames Collins                return reset($row['values']);
4083a385f2cSJames Collins            }//end if
4093a385f2cSJames Collins        }//end foreach
410c165b184SJames Collins
411c165b184SJames Collins        return $value;
412c165b184SJames Collins    }
413c165b184SJames Collins
414c165b184SJames Collins
41595372bffSJames Collins    // phpcs:enable
41695372bffSJames Collins
41795372bffSJames Collins
418c165b184SJames Collins    /**
419a8eebd82SJames Collins     * Check if a page exist in directory or namespace
420c165b184SJames Collins     *
4219cff245bSJames Collins     * @param   string $page Page/namespace to search.
422a8eebd82SJames Collins     * @return  boolean      if page exists
423c165b184SJames Collins     */
4249cff245bSJames Collins    public function pageExists(string $page)
42510b40067Snomadjimbob    {
426ab45ba71SJames Collins        ob_start();
427a8eebd82SJames Collins        tpl_includeFile($page . '.html');
428ab45ba71SJames Collins        $html = ob_get_contents();
429ab45ba71SJames Collins        ob_end_clean();
430a8eebd82SJames Collins
4313a385f2cSJames Collins        if (empty($html) === false) {
4329cff245bSJames Collins            return true;
4339cff245bSJames Collins        }
434a8eebd82SJames Collins
435a8eebd82SJames Collins        $useACL = $this->getConf('includePageUseACL');
436a8eebd82SJames Collins        $propagate = $this->getConf('includePagePropagate');
437a8eebd82SJames Collins
4389cff245bSJames Collins        if ($propagate === true) {
4399cff245bSJames Collins            if (page_findnearest($page, $useACL) !== false) {
4409cff245bSJames Collins                return true;
4419cff245bSJames Collins            }
4429cff245bSJames Collins        } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) {
4439cff245bSJames Collins            return true;
444ab45ba71SJames Collins        }
445ab45ba71SJames Collins
4469cff245bSJames Collins        return false;
447ab45ba71SJames Collins    }
448ab45ba71SJames Collins
449a8eebd82SJames Collins
450c165b184SJames Collins    /**
451a8eebd82SJames Collins     * Print or return page from directory or namespace
4522b4583abSJames Collins     *
4539cff245bSJames Collins     * @param   string  $page         Page/namespace to include.
4549cff245bSJames Collins     * @param   boolean $print        Print content.
4559cff245bSJames Collins     * @param   boolean $parse        Parse content before printing/returning.
4569cff245bSJames Collins     * @param   string  $classWrapper Wrap page in a div with class.
457ab45ba71SJames Collins     * @return  string                contents of page found
4582b4583abSJames Collins     */
4599cff245bSJames Collins    public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '')
4602b4583abSJames Collins    {
461a8eebd82SJames Collins        ob_start();
462a8eebd82SJames Collins        tpl_includeFile($page . '.html');
463a8eebd82SJames Collins        $html = ob_get_contents();
464a8eebd82SJames Collins        ob_end_clean();
465a8eebd82SJames Collins
4663a385f2cSJames Collins        if (empty($html) === true) {
467a8eebd82SJames Collins            $useACL = $this->getConf('includePageUseACL');
468a8eebd82SJames Collins            $propagate = $this->getConf('includePagePropagate');
469ab45ba71SJames Collins            $html = '';
4702b4583abSJames Collins
471ab45ba71SJames Collins            $html = tpl_include_page($page, false, $propagate, $useACL);
472ab45ba71SJames Collins        }
4732b4583abSJames Collins
4743a385f2cSJames Collins        if (empty($html) === false && $parse === true) {
475ab45ba71SJames Collins            $html = $this->parseContent($html);
476ab45ba71SJames Collins        }
4772b4583abSJames Collins
4783a385f2cSJames Collins        if (empty($classWrapper) === false && empty($html) === false) {
4799cff245bSJames Collins            $html = '<div class="' . $classWrapper . '">' . $html . '</div>';
4809cff245bSJames Collins        }
4812b4583abSJames Collins
4829cff245bSJames Collins        if ($print === true) {
4839cff245bSJames Collins            echo $html;
4849cff245bSJames Collins        }
485ab45ba71SJames Collins        return $html;
4862b4583abSJames Collins    }
4872b4583abSJames Collins
488a8eebd82SJames Collins
489a8eebd82SJames Collins    /**
490a8eebd82SJames Collins     * Print or return logged in user information
491a8eebd82SJames Collins     *
4929cff245bSJames Collins     * @param   boolean $print Print content.
493a8eebd82SJames Collins     * @return  string         user information
494a8eebd82SJames Collins     */
4959cff245bSJames Collins    public function includeLoggedIn(bool $print = true)
49610b40067Snomadjimbob    {
497a8eebd82SJames Collins        $html = '';
498a8eebd82SJames Collins
4999cff245bSJames Collins        if (empty($_SERVER['REMOTE_USER']) === false) {
500a8eebd82SJames Collins            $html .= '<div class="mikio-user-info">';
501a8eebd82SJames Collins            ob_start();
502a8eebd82SJames Collins            tpl_userinfo();
503a8eebd82SJames Collins            $html .= ob_get_contents();
504a8eebd82SJames Collins            ob_end_clean();
505a8eebd82SJames Collins            $html .= '</div>';
5062b4583abSJames Collins        }
507a8eebd82SJames Collins
5089cff245bSJames Collins        if ($print === true) {
5099cff245bSJames Collins            echo $html;
5109cff245bSJames Collins        }
511a8eebd82SJames Collins        return $html;
5122b4583abSJames Collins    }
5132b4583abSJames Collins
5142b4583abSJames Collins
515a8eebd82SJames Collins    /**
516a8eebd82SJames Collins     * Print or return DokuWiki Menu
517a8eebd82SJames Collins     *
5189cff245bSJames Collins     * @param   boolean $print Print content.
519a8eebd82SJames Collins     * @return  string         contents of the menu
520a8eebd82SJames Collins     */
5219cff245bSJames Collins    public function includeDWMenu(bool $print = true)
52210b40067Snomadjimbob    {
5232b4583abSJames Collins        global $lang;
5242b4583abSJames Collins        global $USERINFO;
525c165b184SJames Collins
5269cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
527a8eebd82SJames Collins        $html = '<ul class="mikio-nav">';
5282b4583abSJames Collins
529ab45ba71SJames Collins        $pageToolsMenu = [];
530ab45ba71SJames Collins        $siteToolsMenu = [];
531ab45ba71SJames Collins        $userToolsMenu = [];
532c165b184SJames Collins
533ab45ba71SJames Collins        $showIcons  = ($this->getConf('navbarDWMenuType') != 'text');
534ab45ba71SJames Collins        $showText   = ($this->getConf('navbarDWMenuType') != 'icons');
535ab45ba71SJames Collins        $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate');
5362b4583abSJames Collins
5372b4583abSJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
5382b4583abSJames Collins        foreach ($items as $item) {
5399cff245bSJames Collins            if ($item->getType() !== 'top') {
540ab45ba71SJames Collins                $itemHtml = '';
5412b4583abSJames Collins
542905b27c6SJames Collins                $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5439cff245bSJames Collins                if (
5443a385f2cSJames Collins                    $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5453a385f2cSJames Collins                    (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5463a385f2cSJames Collins                    (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5479cff245bSJames Collins                ) {
5489cff245bSJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') .
5499cff245bSJames Collins                        ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5509cff245bSJames Collins                    if ($showIcons === true) {
5519cff245bSJames Collins                        $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5529cff245bSJames Collins                    }
5539cff245bSJames Collins                    if ($showText === true || $isDropDown === true) {
5549cff245bSJames Collins                        $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5559cff245bSJames Collins                    }
556ab45ba71SJames Collins                    $itemHtml .= '</a>';
557ab45ba71SJames Collins
558ab45ba71SJames Collins                    $pageToolsMenu[] = $itemHtml;
5592b4583abSJames Collins                }
5609cff245bSJames Collins            }//end if
5619cff245bSJames Collins        }//end foreach
5622b4583abSJames Collins
563ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action');
564ab45ba71SJames Collins        foreach ($items as $item) {
565ab45ba71SJames Collins            $itemHtml = '';
5662b4583abSJames Collins
567905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5689cff245bSJames Collins            if (
5693a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5703a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5713a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5729cff245bSJames Collins            ) {
5739cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' .
5749cff245bSJames Collins                    $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5759cff245bSJames Collins                if ($showIcons === true) {
5769cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5779cff245bSJames Collins                }
5789cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
5799cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5809cff245bSJames Collins                }
581ab45ba71SJames Collins                $itemHtml .= '</a>';
5822b4583abSJames Collins
583ab45ba71SJames Collins                $siteToolsMenu[] = $itemHtml;
5842b4583abSJames Collins            }
5859cff245bSJames Collins        }//end foreach
5862b4583abSJames Collins
587ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\UserMenu())->getItems('action');
588ab45ba71SJames Collins        foreach ($items as $item) {
589ab45ba71SJames Collins            $itemHtml = '';
590ab45ba71SJames Collins
591905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5929cff245bSJames Collins            if (
5933a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5943a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5953a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5969cff245bSJames Collins            ) {
5979cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' .
5989cff245bSJames Collins                $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5999cff245bSJames Collins                if ($showIcons === true) {
6009cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
6019cff245bSJames Collins                }
6029cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
6039cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
6049cff245bSJames Collins                }
605ab45ba71SJames Collins                $itemHtml .= '</a>';
606ab45ba71SJames Collins
607ab45ba71SJames Collins                $userToolsMenu[] = $itemHtml;
608ab45ba71SJames Collins            }
6099cff245bSJames Collins        }//end foreach
610ab45ba71SJames Collins
611ab45ba71SJames Collins
612ab45ba71SJames Collins        switch ($this->getConf('navbarDWMenuCombine')) {
613ab45ba71SJames Collins            case 'dropdown':
614ab45ba71SJames Collins                $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">';
6159cff245bSJames Collins                $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button"
6169cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6179cff245bSJames Collins                ($showIcons === true ? $this->mikioInlineIcon('file') : '') .
6189cff245bSJames Collins                ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] .
6199cff245bSJames Collins                '</span>') . '</a>';
620a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
621ab45ba71SJames Collins
622ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
623ab45ba71SJames Collins                    $html .= $item;
624ab45ba71SJames Collins                }
625ab45ba71SJames Collins
626ab45ba71SJames Collins                $html .= '</div>';
627ab45ba71SJames Collins                $html .= '</li>';
628ab45ba71SJames Collins
629a8eebd82SJames Collins                $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">';
6309cff245bSJames Collins                $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button"
6319cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6329cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('gear') : '') .
6339cff245bSJames Collins                    ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' .
6349cff245bSJames Collins                    $lang['site_tools'] . '</span>') . '</a>';
635a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
636ab45ba71SJames Collins
637ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
638ab45ba71SJames Collins                    $html .= $item;
639ab45ba71SJames Collins                }
640ab45ba71SJames Collins
641ab45ba71SJames Collins                $html .= '</div>';
642ab45ba71SJames Collins                $html .= '</li>';
643ab45ba71SJames Collins
644a8eebd82SJames Collins                $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">';
6459cff245bSJames Collins                $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button"
6469cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6479cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('user') : '') .
6489cff245bSJames Collins                    ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' .
6499cff245bSJames Collins                    $lang['user_tools'] . '</span>') . '</a>';
650a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
651ab45ba71SJames Collins
652ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
653ab45ba71SJames Collins                    $html .= $item;
654ab45ba71SJames Collins                }
655ab45ba71SJames Collins
656ab45ba71SJames Collins                $html .= '</div>';
657ab45ba71SJames Collins                $html .= '</li>';
658ab45ba71SJames Collins
659ab45ba71SJames Collins                break;
660ab45ba71SJames Collins
661ab45ba71SJames Collins            case 'combine':
662ab45ba71SJames Collins                $html .= '<li class="mikio-nav-dropdown">';
6639cff245bSJames Collins                $html .= '<a class="mikio-nav-link" href="#">' .
6649cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') .
6659cff245bSJames Collins                    ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' .
6669cff245bSJames Collins                    tpl_getLang('tools-menu') . '</span>') . '</a>';
667a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
668ab45ba71SJames Collins
669ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>';
670ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
671ab45ba71SJames Collins                    $html .= $item;
672ab45ba71SJames Collins                }
673ab45ba71SJames Collins
674ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
675ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>';
676ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
677ab45ba71SJames Collins                    $html .= $item;
678ab45ba71SJames Collins                }
679ab45ba71SJames Collins
680ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
681ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>';
682ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
683ab45ba71SJames Collins                    $html .= $item;
684ab45ba71SJames Collins                }
685ab45ba71SJames Collins
686ab45ba71SJames Collins                $html .= '</div>';
687ab45ba71SJames Collins                $html .= '</li>';
688ab45ba71SJames Collins                break;
689ab45ba71SJames Collins
690ab45ba71SJames Collins            default:    // seperate
691ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
692a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
693ab45ba71SJames Collins                }
694ab45ba71SJames Collins
695ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
696a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
697a8eebd82SJames Collins                }
698a8eebd82SJames Collins
699a8eebd82SJames Collins                foreach ($userToolsMenu as $item) {
700a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
701ab45ba71SJames Collins                }
702ab45ba71SJames Collins
703ab45ba71SJames Collins                break;
7049cff245bSJames Collins        }//end switch
705ab45ba71SJames Collins
70612030b10SJames Collins        if ($this->getConf('showLightDark') === true) {
7079e41d878SJames Collins            $html .= '<li class="mikio-darklight">
7089e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' .
7099e41d878SJames Collins            $this->mikioInlineIcon('sun', 'mikio-darklight-light') .
7109e41d878SJames Collins            $this->mikioInlineIcon('moon', 'mikio-darklight-dark') .
7119e41d878SJames Collins            '</a></li>';
71212030b10SJames Collins        }
71312030b10SJames Collins
714ab45ba71SJames Collins        $html .= '</ul>';
715ab45ba71SJames Collins
7169cff245bSJames Collins        if ($print === true) {
7179cff245bSJames Collins            echo $html;
7189cff245bSJames Collins        }
719a8eebd82SJames Collins        return $html;
720a8eebd82SJames Collins    }
721a8eebd82SJames Collins
722a8eebd82SJames Collins
723a8eebd82SJames Collins    /**
724a8eebd82SJames Collins     * Create a nav element from a string. <uri>|<title>;
725a8eebd82SJames Collins     *
7269cff245bSJames Collins     * @param string $str String to generate nav.
727a8eebd82SJames Collins     * @return string     nav elements generated
728a8eebd82SJames Collins     */
7299cff245bSJames Collins    public function stringToNav(string $str)
73010b40067Snomadjimbob    {
731a8eebd82SJames Collins        $html = '';
732a8eebd82SJames Collins
7333a385f2cSJames Collins        if (empty($str) === false) {
734a8eebd82SJames Collins            $items = explode(';', $str);
735a8eebd82SJames Collins            if (count($items) > 0) {
736a8eebd82SJames Collins                $html .= '<ul class="mikio-nav">';
737a8eebd82SJames Collins                foreach ($items as $item) {
738a8eebd82SJames Collins                    $parts = explode('|', $item);
739a8eebd82SJames Collins                    if ($parts > 1) {
7409cff245bSJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' .
7419cff245bSJames Collins                            strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) .
7429cff245bSJames Collins                            '</a></li>';
743a8eebd82SJames Collins                    }
744a8eebd82SJames Collins                }
745a8eebd82SJames Collins                $html .= '</ul>';
746a8eebd82SJames Collins            }
7472b4583abSJames Collins        }
7482b4583abSJames Collins
749ab45ba71SJames Collins        return $html;
7502b4583abSJames Collins    }
7512b4583abSJames Collins
752a8eebd82SJames Collins    /**
753ab45ba71SJames Collins     * print or return the main navbar
7542b4583abSJames Collins     *
7559cff245bSJames Collins     * @param boolean $print   Print the navbar.
7569cff245bSJames Collins     * @param boolean $showSub Include the sub navbar.
757ab45ba71SJames Collins     * @return string          generated content
7582b4583abSJames Collins     */
7599cff245bSJames Collins    public function includeNavbar(bool $print = true, bool $showSub = false)
76010b40067Snomadjimbob    {
761b39ad16dSJames Collins        global $conf, $USERINFO;
762d3d7d2b7SJames Collins
763d3d7d2b7SJames Collins        $homeUrl = wl();
764d3d7d2b7SJames Collins
7659cff245bSJames Collins        if (plugin_isdisabled('showpageafterlogin') === false) {
766d3d7d2b7SJames Collins            $p = &plugin_load('action', 'showpageafterlogin');
7673a385f2cSJames Collins            if (empty($p) === false) {
7689cff245bSJames Collins                if (is_array($USERINFO) === true && count($USERINFO) > 0) {
769d3d7d2b7SJames Collins                    $homeUrl = wl($p->getConf('page_after_login'));
770d3d7d2b7SJames Collins                }
771d3d7d2b7SJames Collins            }
772b39ad16dSJames Collins        } else {
7739cff245bSJames Collins            if (is_array($USERINFO) === true && count($USERINFO) > 0) {
774b39ad16dSJames Collins                $url = $this->getConf('brandURLUser');
775b39ad16dSJames Collins                if (strlen($url) > 0) {
776b39ad16dSJames Collins                    $homeUrl = $url;
777d3d7d2b7SJames Collins                }
778b39ad16dSJames Collins            } else {
779b39ad16dSJames Collins                $url = $this->getConf('brandURLGuest');
780b39ad16dSJames Collins                if (strlen($url) > 0) {
781b39ad16dSJames Collins                    $homeUrl = $url;
782b39ad16dSJames Collins                }
783b39ad16dSJames Collins            }
784b39ad16dSJames Collins        }
785d3d7d2b7SJames Collins
786ab45ba71SJames Collins        $html = '';
78747161538SJames Collins
7889cff245bSJames Collins        $html .= '<nav class="mikio-navbar'  . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') .
7899cff245bSJames Collins            '">';
790f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
791d3d7d2b7SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">';
7929cff245bSJames Collins        if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) {
793ab45ba71SJames Collins            // Brand image
7949cff245bSJames Collins            if ($this->getConf('navbarUseTitleIcon') === true) {
7959cff245bSJames Collins                $logo = $this->getMediaFile('logo', false);
7969cff245bSJames Collins                ;
7973a385f2cSJames Collins                if (empty($logo) === false) {
798f0241fc4SJames Collins                    $width = $this->getConf('navbarTitleIconWidth');
799f0241fc4SJames Collins                    $height = $this->getConf('navbarTitleIconHeight');
800f0241fc4SJames Collins                    $styles = '';
801f0241fc4SJames Collins
802f0241fc4SJames Collins                    if (strlen($width) > 0 || strlen($height) > 0) {
8039cff245bSJames Collins                        if (ctype_digit($width) === true) {
804f0241fc4SJames Collins                            $styles .= 'max-width:' . intval($width) . 'px;';
8059cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) {
806f0241fc4SJames Collins                            $styles .= 'max-width:' . $width . ';';
8079cff245bSJames Collins                        } elseif (strcasecmp($width, 'none') === 0) {
8087a92c19bSJames Collins                            $styles .= 'max-width:none;';
809f0241fc4SJames Collins                        }
810f0241fc4SJames Collins
8119cff245bSJames Collins                        if (ctype_digit($height) === true) {
812f0241fc4SJames Collins                            $styles .= 'max-height:' . intval($height) . 'px;';
8139cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) {
814f0241fc4SJames Collins                            $styles .= 'max-height:' . $height . ';';
8159cff245bSJames Collins                        } elseif (strcasecmp($height, 'none') === 0) {
8167a92c19bSJames Collins                            $styles .= 'max-height:none;';
817f0241fc4SJames Collins                        }
818f0241fc4SJames Collins
819f0241fc4SJames Collins                        if (strlen($styles) > 0) {
820f0241fc4SJames Collins                            $styles = ' style="' . $styles . '"';
821f0241fc4SJames Collins                        }
8229cff245bSJames Collins                    }//end if
823f0241fc4SJames Collins
824f0241fc4SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>';
8259cff245bSJames Collins                }//end if
8269cff245bSJames Collins            }//end if
827ab45ba71SJames Collins
828ab45ba71SJames Collins            // Brand title
8299cff245bSJames Collins            if ($this->getConf('navbarUseTitleText') === true) {
830ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
831a8eebd82SJames Collins                $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>';
8329cff245bSJames Collins                if ($this->getConf('navbarUseTaglineText') === true) {
833a8eebd82SJames Collins                    $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>';
834ab45ba71SJames Collins                }
835ab45ba71SJames Collins                $html .= '</div>';
836ab45ba71SJames Collins            }
8379cff245bSJames Collins        }//end if
838ab45ba71SJames Collins        $html .= '</a>';
839660b2c71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>';
840ab45ba71SJames Collins
841ab45ba71SJames Collins        // Menus
842ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
843ab45ba71SJames Collins
8449cff245bSJames Collins        $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'),
8459cff245bSJames Collins            $this->getConf('navbarPosRight', 'none')
8469cff245bSJames Collins        ];
847a8eebd82SJames Collins        foreach ($menus as $menuType) {
848a8eebd82SJames Collins            switch ($menuType) {
849a8eebd82SJames Collins                case 'custom':
850a8eebd82SJames Collins                    $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', ''));
851a8eebd82SJames Collins                    break;
852a8eebd82SJames Collins                case 'search':
853ab45ba71SJames Collins                    $html .= '<div class="mikio-nav-item">';
854ab45ba71SJames Collins                    $html .= $this->includeSearch(false);
855ab45ba71SJames Collins                    $html .= '</div>';
856a8eebd82SJames Collins                    break;
857a8eebd82SJames Collins                case 'dokuwiki':
8589cff245bSJames Collins                    $html .= $this->includeDWMenu(false);
859a8eebd82SJames Collins                    break;
860a8eebd82SJames Collins            }
861a8eebd82SJames Collins        }
862ab45ba71SJames Collins
863ab45ba71SJames Collins        $html .= '</div>';
864f8039bf2SJames Collins        $html .= '</div>';
865ab45ba71SJames Collins        $html .= '</nav>';
866ab45ba71SJames Collins
867a8eebd82SJames Collins        // Sub Navbar
8689cff245bSJames Collins        if ($showSub === true) {
8699cff245bSJames Collins            $sub = $this->includePage('submenu', false);
8703a385f2cSJames Collins            if (empty($sub) === false) {
8719cff245bSJames Collins                $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>';
8729cff245bSJames Collins            }
873ab45ba71SJames Collins        }
874ab45ba71SJames Collins
8759cff245bSJames Collins        if ($print === true) {
8769cff245bSJames Collins            echo $html;
8779cff245bSJames Collins        }
878ab45ba71SJames Collins        return $html;
879ab45ba71SJames Collins    }
880ab45ba71SJames Collins
881ab45ba71SJames Collins
882a8eebd82SJames Collins    /**
883a8eebd82SJames Collins     * Is there a sidebar
884a8eebd82SJames Collins     *
8859cff245bSJames Collins     * @param   string $prefix Sidebar prefix to use when searching.
886a8eebd82SJames Collins     * @return  boolean        if sidebar exists
887a8eebd82SJames Collins     */
8889cff245bSJames Collins    public function sidebarExists(string $prefix = '')
88910b40067Snomadjimbob    {
890a8eebd82SJames Collins        global $conf;
891a8eebd82SJames Collins
8923a385f2cSJames Collins        if (strcasecmp($prefix, 'left') === 0) {
8939cff245bSJames Collins            $prefix = '';
8949cff245bSJames Collins        }
895a8eebd82SJames Collins
896a8eebd82SJames Collins        return $this->pageExists($conf['sidebar' . $prefix]);
897a8eebd82SJames Collins    }
898a8eebd82SJames Collins
899a8eebd82SJames Collins
900a8eebd82SJames Collins    /**
901ab45ba71SJames Collins     * Print or return the sidebar content
902ab45ba71SJames Collins     *
9039cff245bSJames Collins     * @param   string  $prefix Sidebar prefix to use when searching.
9049cff245bSJames Collins     * @param   boolean $print  Print the generated content to the output buffer.
9059cff245bSJames Collins     * @param   boolean $parse  Parse the content.
906ab45ba71SJames Collins     * @return  string          generated content
907ab45ba71SJames Collins     */
9089cff245bSJames Collins    public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true)
90910b40067Snomadjimbob    {
910ab45ba71SJames Collins        global $conf, $ID;
911ab45ba71SJames Collins
912ab45ba71SJames Collins        $html = '';
913ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
914ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
915ab45ba71SJames Collins
9163a385f2cSJames Collins        if (empty($confPrefix) === true) {
9179cff245bSJames Collins            $confPrefix = 'Left';
9189cff245bSJames Collins        }
9191cdedf28SJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9209cff245bSJames Collins            $prefix = '';
9219cff245bSJames Collins        }
922ab45ba71SJames Collins
9231cdedf28SJames Collins        $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar'];
924ab45ba71SJames Collins
9259cff245bSJames Collins        if (
9269cff245bSJames Collins            $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false &&
9271cdedf28SJames Collins            p_get_metadata($ID, 'nosidebar', false) === null
9289cff245bSJames Collins        ) {
9299cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'header', false);
9303a385f2cSJames Collins            if (empty($content) === false) {
9319cff245bSJames Collins                $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
9329cff245bSJames Collins            }
933ab45ba71SJames Collins
9343a385f2cSJames Collins            if (empty($prefix) === true) {
9359cff245bSJames Collins                $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'),
9369cff245bSJames Collins                    $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4')
9379cff245bSJames Collins                ];
938ab45ba71SJames Collins
939a8eebd82SJames Collins                foreach ($rows as $row) {
940a8eebd82SJames Collins                    switch ($row) {
941a8eebd82SJames Collins                        case 'search':
9429cff245bSJames Collins                            $html .= $this->includeSearch(false);
943a8eebd82SJames Collins                            break;
944a8eebd82SJames Collins                        case 'logged in user':
9459cff245bSJames Collins                            $html .= $this->includeLoggedIn(false);
946a8eebd82SJames Collins                            break;
947a8eebd82SJames Collins                        case 'content':
9489cff245bSJames Collins                            $content = $this->includePage($sidebarPage, false);
9493a385f2cSJames Collins                            if (empty($content) === false) {
9509cff245bSJames Collins                                $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9519cff245bSJames Collins                            }
952a8eebd82SJames Collins                            break;
953a8eebd82SJames Collins                        case 'tags':
954a8eebd82SJames Collins                            $html .= '<div class="mikio-tags"></div>';
955a8eebd82SJames Collins                    }
956a8eebd82SJames Collins                }
957a8eebd82SJames Collins            } else {
9589cff245bSJames Collins                $content = $this->includePage($sidebarPage, false);
9593a385f2cSJames Collins                if (empty($content) === false) {
9609cff245bSJames Collins                    $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9619cff245bSJames Collins                }
9629cff245bSJames Collins            }//end if
9639cff245bSJames Collins
9649cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'footer', false);
9653a385f2cSJames Collins            if (empty($content) === false) {
9669cff245bSJames Collins                $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
9679cff245bSJames Collins            }
9689cff245bSJames Collins        }//end if
9699cff245bSJames Collins
9703a385f2cSJames Collins        if (empty($html) === true) {
9713a385f2cSJames Collins            if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) {
9729cff245bSJames Collins                $html = '&nbsp;';
9739cff245bSJames Collins            }
9749cff245bSJames Collins            if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) {
9759cff245bSJames Collins                $html = '&nbsp;';
9769cff245bSJames Collins            }
977a8eebd82SJames Collins        }
978ab45ba71SJames Collins
9793a385f2cSJames Collins        if (empty($html) === false) {
9801cdedf28SJames Collins            $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) .
9819cff245bSJames Collins                '"><a class="mikio-sidebar-toggle' .
9829cff245bSJames Collins                ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' .
9839cff245bSJames Collins                tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' .
9849cff245bSJames Collins                $html . '</div></aside>';
985ab45ba71SJames Collins        }
986ab45ba71SJames Collins
9879cff245bSJames Collins        if ($parse === true) {
9889cff245bSJames Collins            $html = $this->includeIcons($html);
9893a04a100SJames Collins        }
9909cff245bSJames Collins        if ($print === true) {
9919cff245bSJames Collins            echo $html;
992ab45ba71SJames Collins        }
993ab45ba71SJames Collins        return $html;
994ab45ba71SJames Collins    }
995ab45ba71SJames Collins
996ab45ba71SJames Collins
997a8eebd82SJames Collins    /**
998ab45ba71SJames Collins     * Print or return the page tools content
999ab45ba71SJames Collins     *
10009cff245bSJames Collins     * @param   boolean $print     Print the generated content to the output buffer.
10019cff245bSJames Collins     * @param   boolean $includeId Include the dw__pagetools id in the element.
1002ab45ba71SJames Collins     * @return  string             generated content
1003ab45ba71SJames Collins     */
10049cff245bSJames Collins    public function includePageTools(bool $print = true, bool $includeId = false)
100510b40067Snomadjimbob    {
10061293ce10SJames Collins        global $USERINFO;
10071293ce10SJames Collins
10089cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
1009ab45ba71SJames Collins        $html = '';
1010ab45ba71SJames Collins
10119cff245bSJames Collins        $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
1012b9c0582bSJames Collins        $html .= '<ul class="tools">';
1013ab45ba71SJames Collins
1014ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
1015ab45ba71SJames Collins        foreach ($items as $item) {
10169cff245bSJames Collins            $classes = [];
10173fd763a0SJames Collins            $classes[] = $item->getType();
10183fd763a0SJames Collins            $attr = $item->getLinkAttributes();
10193fd763a0SJames Collins
10209cff245bSJames Collins            if (empty($attr['class']) === false) {
10213fd763a0SJames Collins                $classes = array_merge($classes, explode(' ', $attr['class']));
1022ab45ba71SJames Collins            }
1023ab45ba71SJames Collins
10243fd763a0SJames Collins            $classes = array_unique($classes);
10253fd763a0SJames Collins
10261293ce10SJames Collins            $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()));
10279cff245bSJames Collins            if (
10283a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
10293a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
10303a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true))
10319cff245bSJames Collins            ) {
10323fd763a0SJames Collins                $html .= '<li class="' . implode(' ', $classes) . '">';
10339cff245bSJames Collins                $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' .
10349cff245bSJames Collins                    $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) .
10359cff245bSJames Collins                    '</div><span class="a11y">' . $item->getLabel() . '</span></a>';
10363fd763a0SJames Collins                $html .= '</li>';
10373fd763a0SJames Collins            }
10389cff245bSJames Collins        }//end foreach
10393fd763a0SJames Collins
10403fd763a0SJames Collins        $html .= '</ul>';
1041ab45ba71SJames Collins        $html .= '</nav>';
1042ab45ba71SJames Collins
10439cff245bSJames Collins        if ($print === true) {
10449cff245bSJames Collins            echo $html;
10459cff245bSJames Collins        }
1046ab45ba71SJames Collins        return $html;
1047ab45ba71SJames Collins    }
1048ab45ba71SJames Collins
1049ab45ba71SJames Collins
1050a8eebd82SJames Collins    /**
1051a8eebd82SJames Collins     * Print or return the search bar
1052a8eebd82SJames Collins     *
10539cff245bSJames Collins     * @param   boolean $print Print content.
1054a8eebd82SJames Collins     * @return  string         contents of the search bar
1055a8eebd82SJames Collins     */
10569cff245bSJames Collins    public function includeSearch(bool $print = true)
105710b40067Snomadjimbob    {
10589cff245bSJames Collins        global $lang, $ID, $ACT, $QUERY;
1059ab45ba71SJames Collins        $html = '';
1060ab45ba71SJames Collins
10619cff245bSJames Collins        $html .= '<form class="mikio-search search" action="' . wl() .
10629cff245bSJames Collins            '" accept-charset="utf-8" method="get" role="search">';
1063a8eebd82SJames Collins        $html .= '<input type="hidden" name="do" value="search">';
1064a8eebd82SJames Collins        $html .= '<input type="hidden" name="id" value="' . $ID . '">';
1065c1cb9f15SChris MacMackin        $html .= '<input name="q" ';
10669cff245bSJames Collins        if ($this->getConf('searchUseTypeahead') === true) {
1067c1cb9f15SChris MacMackin            $html .= 'class="search_typeahead" ';
1068c1cb9f15SChris MacMackin        }
10699cff245bSJames Collins        $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' .
10703a385f2cSJames Collins            ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
1071a8eebd82SJames Collins        $html .= '<button type="submit" title="' .  $lang['btn_search'] . '">';
10723a385f2cSJames Collins        if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) {
1073a8eebd82SJames Collins            $html .= $this->mikioInlineIcon('search');
1074ab45ba71SJames Collins        } else {
1075ab45ba71SJames Collins            $html .= $lang['btn_search'];
1076ab45ba71SJames Collins        }
1077ab45ba71SJames Collins        $html .= '</button>';
1078ab45ba71SJames Collins        $html .= '</form>';
1079ab45ba71SJames Collins
10809cff245bSJames Collins        if ($print === true) {
10819cff245bSJames Collins            echo $html;
10829cff245bSJames Collins        }
1083ab45ba71SJames Collins        return $html;
1084ab45ba71SJames Collins    }
1085ab45ba71SJames Collins
1086ab45ba71SJames Collins
1087a8eebd82SJames Collins    /**
1088a8eebd82SJames Collins     * Print or return content
1089a8eebd82SJames Collins     *
10909cff245bSJames Collins     * @param   boolean $print Print content.
1091a8eebd82SJames Collins     * @return  string         contents
1092a8eebd82SJames Collins     */
10939cff245bSJames Collins    public function includeContent(bool $print = true)
109410b40067Snomadjimbob    {
1095ab45ba71SJames Collins        ob_start();
10969cff245bSJames Collins        tpl_content(false);
1097ab45ba71SJames Collins        $html = ob_get_contents();
1098ab45ba71SJames Collins        ob_end_clean();
1099ab45ba71SJames Collins
1100ab45ba71SJames Collins        $html = $this->includeIcons($html);
1101ab45ba71SJames Collins        $html = $this->parseContent($html);
1102ab45ba71SJames Collins
1103ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
1104ab45ba71SJames Collins
11059cff245bSJames Collins        if ($this->getConf('heroTitle') === false) {
11069cff245bSJames Collins            $html = '<div class="mikio-tags"></div>' . $html;
11079cff245bSJames Collins        }
1108a8eebd82SJames Collins
1109a8eebd82SJames Collins        $html = '<div class="mikio-article-content">' . $html . '</div>';
1110a8eebd82SJames Collins
11119cff245bSJames Collins        if ($print === true) {
11129cff245bSJames Collins            echo $html;
11139cff245bSJames Collins        }
1114ab45ba71SJames Collins        return $html;
1115ab45ba71SJames Collins    }
1116ab45ba71SJames Collins
1117a8eebd82SJames Collins    /**
1118ab45ba71SJames Collins     * Print or return footer
1119ab45ba71SJames Collins     *
11209cff245bSJames Collins     * @param   boolean $print Print footer.
11219cff245bSJames Collins     * @return  string         HTML string containing footer
1122ab45ba71SJames Collins     */
11239cff245bSJames Collins    public function includeFooter(bool $print = true)
112410b40067Snomadjimbob    {
1125ab45ba71SJames Collins        global $ACT;
1126ab45ba71SJames Collins
1127ab45ba71SJames Collins        $html = '';
1128ab45ba71SJames Collins
1129ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
11309cff245bSJames Collins        $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>';
11319cff245bSJames Collins        $html .= $this->includePage('footer', false);
1132ab45ba71SJames Collins
1133a8eebd82SJames Collins        $html .= $this->stringToNav($this->getConf('footerCustomMenuText'));
1134ab45ba71SJames Collins
11359cff245bSJames Collins        if ($this->getConf('footerSearch') === true) {
1136ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
11379cff245bSJames Collins            $html .= $this->includeSearch(false);
1138ab45ba71SJames Collins            $html .= '</div>';
1139ab45ba71SJames Collins        }
1140ab45ba71SJames Collins
1141a8eebd82SJames Collins        $showPageTools = $this->getConf('pageToolsFooter');
11429cff245bSJames Collins        if (
11433a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 ||
11443a385f2cSJames Collins            $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0)
11459cff245bSJames Collins        ) {
11469cff245bSJames Collins            $html .= $this->includePageTools(false);
11479cff245bSJames Collins        }
1148ab45ba71SJames Collins
11499cff245bSJames Collins        $meta['licenseType']            = ['multichoice', '_choices' => ['none', 'badge', 'button']];
11509cff245bSJames Collins        $meta['licenseImageOnly']       = ['onoff'];
1151ab45ba71SJames Collins
1152ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
11539cff245bSJames Collins        if ($licenseType !== 'none') {
11549cff245bSJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true);
1155ab45ba71SJames Collins        }
1156ab45ba71SJames Collins
1157ab45ba71SJames Collins        $html .= '</footer>';
1158ab45ba71SJames Collins
11599cff245bSJames Collins        if ($print === true) {
11609cff245bSJames Collins            echo $html;
11619cff245bSJames Collins        }
1162ab45ba71SJames Collins        return $html;
1163ab45ba71SJames Collins    }
1164ab45ba71SJames Collins
1165ab45ba71SJames Collins
1166a8eebd82SJames Collins    /**
1167ab45ba71SJames Collins     * Print or return breadcrumb trail
1168ab45ba71SJames Collins     *
11699cff245bSJames Collins     * @param   boolean $print Print out trail.
11709cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
11719cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
1172ab45ba71SJames Collins     */
11739cff245bSJames Collins    public function includeBreadcrumbs(bool $print = true, bool $parse = true)
117410b40067Snomadjimbob    {
1175a8eebd82SJames Collins        global $conf, $ID, $lang, $ACT;
1176a8eebd82SJames Collins
11773a385f2cSJames Collins        if (
11783a385f2cSJames Collins            $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 &&
117995372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0
11803a385f2cSJames Collins        ) {
11819cff245bSJames Collins            return '';
11829cff245bSJames Collins        }
1183ab45ba71SJames Collins
1184ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
1185f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
11863a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
118795372bffSJames Collins            if ($conf['breadcrumbs'] !== 0) {
11889cff245bSJames Collins                if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) {
1189ab45ba71SJames Collins                    ob_start();
119075adba86SJames Collins                    tpl_breadcrumbs();
1191ab45ba71SJames Collins                    $html .= ob_get_contents();
1192ab45ba71SJames Collins                    ob_end_clean();
1193ab45ba71SJames Collins                } else {
1194ab45ba71SJames Collins                    $sep = '•';
1195ab45ba71SJames Collins                    $prefix = $lang['breadcrumb'];
1196ab45ba71SJames Collins
11979cff245bSJames Collins                    if ($this->getConf('breadcrumbSep') === true) {
1198ab45ba71SJames Collins                        $sep = $this->getConf('breadcrumbSepText');
11999cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-sep', false);
1200ab45ba71SJames Collins
12019cff245bSJames Collins                        if ($img !== false) {
1202ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1203ab45ba71SJames Collins                        }
120447161538SJames Collins                    }
120547161538SJames Collins
12069cff245bSJames Collins                    if ($this->getConf('breadcrumbPrefix') === true) {
1207ab45ba71SJames Collins                        $prefix = $this->getConf('breadcrumbPrefixText');
12089cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-prefix', false);
1209ab45ba71SJames Collins
12109cff245bSJames Collins                        if ($img !== false) {
1211ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
1212ab45ba71SJames Collins                        }
1213ab45ba71SJames Collins                    }
1214ab45ba71SJames Collins
1215ab45ba71SJames Collins                    $crumbs = breadcrumbs();
1216ab45ba71SJames Collins
1217ab45ba71SJames Collins                    $html .= '<ul>';
12183a385f2cSJames Collins                    if (empty($prefix) === false) {
12199cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12209cff245bSJames Collins                    }
1221ab45ba71SJames Collins
1222ab45ba71SJames Collins                    $last = count($crumbs);
1223ab45ba71SJames Collins                    $i    = 0;
1224ab45ba71SJames Collins                    foreach ($crumbs as $id => $name) {
1225ab45ba71SJames Collins                        $i++;
122695372bffSJames Collins                        if ($i !== 1) {
1227ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
122895372bffSJames Collins                        }
12299cff245bSJames Collins                        $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>';
12309cff245bSJames Collins                        $html .= tpl_pagelink($id, null, true);
1231ab45ba71SJames Collins                        $html .= '</li>';
1232ab45ba71SJames Collins                    }
1233ab45ba71SJames Collins
1234ab45ba71SJames Collins                    $html .= '</ul>';
12359cff245bSJames Collins                }//end if
12369cff245bSJames Collins            }//end if
12379cff245bSJames Collins        }//end if
12383d11a778SJames Collins
12393d11a778SJames Collins        $html .= '</div>';
12403d11a778SJames Collins        $html .= '</div>';
12413d11a778SJames Collins
12429cff245bSJames Collins        if ($parse === true) {
12439cff245bSJames Collins            $html = $this->includeIcons($html);
12449cff245bSJames Collins        }
12459cff245bSJames Collins        if ($print === true) {
12469cff245bSJames Collins            echo $html;
12479cff245bSJames Collins        }
12483d11a778SJames Collins        return $html;
12493d11a778SJames Collins    }
12503d11a778SJames Collins
12513d11a778SJames Collins    /**
12523d11a778SJames Collins     * Print or return you are here trail
12533d11a778SJames Collins     *
12549cff245bSJames Collins     * @param   boolean $print Print out trail.
12559cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12569cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
12573d11a778SJames Collins     */
12589cff245bSJames Collins    public function includeYouAreHere(bool $print = true, bool $parse = true)
12593d11a778SJames Collins    {
12603d11a778SJames Collins        global $conf, $ID, $lang, $ACT;
12613d11a778SJames Collins
12623a385f2cSJames Collins        if (
12633a385f2cSJames Collins            $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 &&
126495372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0
12653a385f2cSJames Collins        ) {
12669cff245bSJames Collins            return '';
12679cff245bSJames Collins        }
12683d11a778SJames Collins
12693d11a778SJames Collins        $html = '<div class="mikio-youarehere">';
12703d11a778SJames Collins        $html .= '<div class="mikio-container">';
12713a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
127295372bffSJames Collins            if ($conf['youarehere'] !== 0) {
12739cff245bSJames Collins                if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) {
127495372bffSJames Collins                    $html .= '<div class="mikio-bcdw">';
1275ab45ba71SJames Collins                    ob_start();
127675adba86SJames Collins                    tpl_youarehere();
1277ab45ba71SJames Collins                    $html .= ob_get_contents();
1278ab45ba71SJames Collins                    ob_end_clean();
127995372bffSJames Collins                    $html .= '</div>';
1280ab45ba71SJames Collins                } else {
1281ab45ba71SJames Collins                    $sep = ' » ';
1282ab45ba71SJames Collins                    $prefix = $lang['youarehere'];
1283ab45ba71SJames Collins
12849cff245bSJames Collins                    if ($this->getConf('youarehereSep') === true) {
12853d11a778SJames Collins                        $sep = $this->getConf('youarehereSepText');
12869cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-sep', false);
1287ab45ba71SJames Collins
12889cff245bSJames Collins                        if ($img !== false) {
1289ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1290ab45ba71SJames Collins                        }
129175adba86SJames Collins                    }
129275adba86SJames Collins
12939cff245bSJames Collins                    if ($this->getConf('youareherePrefix') === true) {
12943d11a778SJames Collins                        $prefix = $this->getConf('youareherePrefixText');
12959cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-prefix', false);
1296ab45ba71SJames Collins
12979cff245bSJames Collins                        if ($img !== false) {
1298ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
129975adba86SJames Collins                        }
130047161538SJames Collins                    }
130147161538SJames Collins
1302ab45ba71SJames Collins                    $html .= '<ul>';
13033a385f2cSJames Collins                    if (empty($prefix) === false) {
13049cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
13059cff245bSJames Collins                    }
13069cff245bSJames Collins                    $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>';
1307ab45ba71SJames Collins
1308ab45ba71SJames Collins                    $parts = explode(':', $ID);
1309ab45ba71SJames Collins                    $count = count($parts);
1310ab45ba71SJames Collins
1311ab45ba71SJames Collins                    $part = '';
13129cff245bSJames Collins                    for ($i = 0; $i < ($count - 1); $i++) {
1313ab45ba71SJames Collins                        $part .= $parts[$i] . ':';
1314ab45ba71SJames Collins                        $page = $part;
13159cff245bSJames Collins                        if ($page === $conf['start']) {
13169cff245bSJames Collins                            continue;
13179cff245bSJames Collins                        }
1318ab45ba71SJames Collins
1319ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
13209cff245bSJames Collins                        $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1321ab45ba71SJames Collins                    }
1322ab45ba71SJames Collins
1323ab45ba71SJames Collins                    resolve_pageid('', $page, $exists);
13249cff245bSJames Collins                    if ((isset($page) === true && $page === $part . $parts[$i]) === false) {
1325ab45ba71SJames Collins                        $page = $part . $parts[$i];
13269cff245bSJames Collins                        if ($page !== $conf['start']) {
1327ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
13289cff245bSJames Collins                            $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1329ab45ba71SJames Collins                        }
1330ab45ba71SJames Collins                    }
1331ab45ba71SJames Collins
1332ab45ba71SJames Collins                    $html .= '</ul>';
13339cff245bSJames Collins                }//end if
13349cff245bSJames Collins            }//end if
1335ab45ba71SJames Collins
13363d11a778SJames Collins            $showLast = $this->getConf('youarehereShowLast');
13379cff245bSJames Collins            if ($showLast !== 0) {
1338a8eebd82SJames Collins                preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches);
13399cff245bSJames Collins                if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) {
1340a8eebd82SJames Collins                    $count = count($matches[0]);
1341a8eebd82SJames Collins                    $list = '';
1342a8eebd82SJames Collins
1343a8eebd82SJames Collins                    // Show Home
1344a8eebd82SJames Collins                    $list .= $matches[0][0] . $matches[0][1];
1345a8eebd82SJames Collins
1346a8eebd82SJames Collins                    $list .= '<li>...</li>';
13479cff245bSJames Collins                    for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) {
1348a8eebd82SJames Collins                        $list .= $matches[0][$i];
1349a8eebd82SJames Collins                    }
1350a8eebd82SJames Collins
1351a8eebd82SJames Collins                    $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html);
1352a8eebd82SJames Collins                }
1353a8eebd82SJames Collins            }
1354a8eebd82SJames Collins
13553d11a778SJames Collins            switch ($this->getConf('youarehereHome')) {
1356a8eebd82SJames Collins                case 'none':
1357a8eebd82SJames Collins                    $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2);
1358a8eebd82SJames Collins                    break;
1359a8eebd82SJames Collins                case 'home':
1360a8eebd82SJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1);
1361a8eebd82SJames Collins                    break;
1362a8eebd82SJames Collins                case 'icon':
13639cff245bSJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' .
13649cff245bSJames Collins                        $this->mikioInlineIcon('home') . '$3', $html, 1);
1365a8eebd82SJames Collins                    break;
1366a8eebd82SJames Collins            }
1367a8eebd82SJames Collins        } else {
1368a8eebd82SJames Collins            $html .= '&#8810; ';
13699cff245bSJames Collins            if (isset($_GET['page']) === true) {
13709cff245bSJames Collins                $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
1371a8eebd82SJames Collins            }
13724057121fSJames Collins            $html .= '<a href="' . wl($ID) . '">View Page</a>';
13739cff245bSJames Collins        }//end if
13749cff245bSJames Collins
13759cff245bSJames Collins        $html .= '</div>';
13769cff245bSJames Collins        $html .= '</div>';
13779cff245bSJames Collins
13789cff245bSJames Collins        if ($parse === true) {
13799cff245bSJames Collins            $html = $this->includeIcons($html);
1380a8eebd82SJames Collins        }
13819cff245bSJames Collins        if ($print === true) {
13829cff245bSJames Collins            echo $html;
13839cff245bSJames Collins        }
1384ab45ba71SJames Collins        return $html;
1385ab45ba71SJames Collins    }
1386ab45ba71SJames Collins
13871785fc73SJames Collins    /**
13881785fc73SJames Collins     * Get Page Title
13899cff245bSJames Collins     *
13909cff245bSJames Collins     * @return string page title
13911785fc73SJames Collins     */
139210b40067Snomadjimbob    public function parsePageTitle()
139310b40067Snomadjimbob    {
13942060e56cSJames Collins        global $ID;
13952060e56cSJames Collins
13962060e56cSJames Collins        $title = p_get_first_heading($ID);
13979cff245bSJames Collins        if (strlen($title) <= 0) {
13989cff245bSJames Collins            $title = tpl_pagetitle(null, true);
13999cff245bSJames Collins        }
14001785fc73SJames Collins        $title = $this->includeIcons($title);
14011785fc73SJames Collins
14021785fc73SJames Collins        return $title;
14031785fc73SJames Collins    }
14041785fc73SJames Collins
1405ab45ba71SJames Collins
140675adba86SJames Collins    /**
1407a8eebd82SJames Collins     * Print or return hero block
140875adba86SJames Collins     *
14099cff245bSJames Collins     * @param   boolean $print Print content.
1410a8eebd82SJames Collins     * @return  string         contents of hero
141175adba86SJames Collins     */
14129cff245bSJames Collins    public function includeHero(bool $print = true)
141310b40067Snomadjimbob    {
1414a8eebd82SJames Collins        $html = '';
141547161538SJames Collins
14169cff245bSJames Collins        if ($this->getConf('heroTitle') === true) {
1417a8eebd82SJames Collins            $html .= '<div class="mikio-hero">';
1418f8039bf2SJames Collins            $html .= '<div class="mikio-container">';
1419a8eebd82SJames Collins            $html .= '<div class="mikio-hero-text">';
14203a385f2cSJames Collins            if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) {
14219cff245bSJames Collins                $html .= $this->includeYouAreHere(false);
14229cff245bSJames Collins            }
14233a385f2cSJames Collins            if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) {
14249cff245bSJames Collins                $html .= $this->includeBreadcrumbs(false);
14259cff245bSJames Collins            }
1426ab45ba71SJames Collins
1427a8eebd82SJames Collins            $html .= '<h1 class="mikio-hero-title">';
14281785fc73SJames Collins            $html .= $this->parsePageTitle();    // No idea why this requires a blank space afterwards to work?
1429a8eebd82SJames Collins            $html .= '</h1>';
1430a8eebd82SJames Collins            $html .= '<h2 class="mikio-hero-subtitle"></h2>';
1431a8eebd82SJames Collins            $html .= '</div>';
143247161538SJames Collins
14339cff245bSJames Collins            $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true));
1434a8eebd82SJames Collins            $hero_image_resize_class = '';
14353a385f2cSJames Collins            if (empty($hero_image) === false) {
1436a8eebd82SJames Collins                $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"';
1437a8eebd82SJames Collins                $hero_image_resize_class = ' mikio-hero-image-resize';
143847161538SJames Collins            }
1439a8eebd82SJames Collins
14409cff245bSJames Collins            $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image .
14419cff245bSJames Collins                '><div class="mikio-tags"></div></div>';
1442a8eebd82SJames Collins
1443a8eebd82SJames Collins            $html .= '</div>';
1444f8039bf2SJames Collins            $html .= '</div>';
14459cff245bSJames Collins        }//end if
14469cff245bSJames Collins
14479cff245bSJames Collins        if ($print === true) {
14489cff245bSJames Collins            echo $html;
144975adba86SJames Collins        }
1450a8eebd82SJames Collins
1451a8eebd82SJames Collins        return $html;
145275adba86SJames Collins    }
145375adba86SJames Collins
145475adba86SJames Collins
145575adba86SJames Collins    /**
1456a8eebd82SJames Collins     * Print or return out TOC
145775adba86SJames Collins     *
14589cff245bSJames Collins     * @param   boolean $print Print TOC.
14599cff245bSJames Collins     * @param   boolean $parse Parse icons.
1460a8eebd82SJames Collins     * @return  string         contents of TOC
146175adba86SJames Collins     */
14629cff245bSJames Collins    public function includeTOC(bool $print = true, bool $parse = true)
146310b40067Snomadjimbob    {
1464ab45ba71SJames Collins        $html = '';
14652b4583abSJames Collins
1466ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
1467ab45ba71SJames Collins
14683a385f2cSJames Collins        if (empty($tocHtml) === false) {
1469f65a4e5eSJames Collins            $tocHtml = preg_replace(
1470f65a4e5eSJames Collins                '/(<h3.+?toggle.+?>)(.+?)<\/h3>/',
1471f65a4e5eSJames Collins                '$1' .
1472f65a4e5eSJames Collins                $this->mikioInlineIcon('hamburger', 'hamburger') . '$2' .
1473f65a4e5eSJames Collins                $this->mikioInlineIcon('down-arrow', 'down-arrow') . '</h3>',
1474f65a4e5eSJames Collins                $tocHtml
1475f65a4e5eSJames Collins            );
1476ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
1477a8eebd82SJames Collins            $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml);
1478ab45ba71SJames Collins
1479ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
1480ab45ba71SJames Collins            $html .= $tocHtml;
1481ab45ba71SJames Collins            $html .= '</div>';
14822b4583abSJames Collins        }
14832b4583abSJames Collins
14849cff245bSJames Collins        if ($parse === true) {
14859cff245bSJames Collins            $html = $this->includeIcons($html);
14869cff245bSJames Collins        }
14879cff245bSJames Collins
14889cff245bSJames Collins        if ($print === true) {
1489ab45ba71SJames Collins            echo $html;
1490ab45ba71SJames Collins        }
1491ab45ba71SJames Collins
14929cff245bSJames Collins        return $html;
14939cff245bSJames Collins    }
14949cff245bSJames Collins
1495ab45ba71SJames Collins
1496a8eebd82SJames Collins    /**
1497ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
1498ab45ba71SJames Collins     *
14999cff245bSJames Collins     * @param   string $str Content to parse.
1500ab45ba71SJames Collins     * @return  string      parsed string
1501ab45ba71SJames Collins     */
15029cff245bSJames Collins    public function includeIcons(string $str)
150310b40067Snomadjimbob    {
1504ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
1505ab45ba71SJames Collins
1506ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
15073a385f2cSJames Collins        if (empty($iconTag) === true) {
15089cff245bSJames Collins            return $str;
15099cff245bSJames Collins        }
1510ab45ba71SJames Collins
15119cff245bSJames Collins        if (
15129cff245bSJames Collins            in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true ||
15133a385f2cSJames Collins            strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0
15149cff245bSJames Collins        ) {
1515a2005a27SJames Collins            $content = $str;
1516a2005a27SJames Collins            $preview = null;
1517a2005a27SJames Collins
15183a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15199cff245bSJames Collins                $html = new \simple_html_dom();
1520a2005a27SJames Collins                $html->stripRNAttrValues = false;
1521a2005a27SJames Collins                $html->load($str, true, false);
1522a2005a27SJames Collins
1523a2005a27SJames Collins                $preview = $html->find('div.preview');
15249cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1525a2005a27SJames Collins                    $content = $preview[0]->innertext;
1526a2005a27SJames Collins                }
1527a2005a27SJames Collins            }
1528a2005a27SJames Collins
15291785fc73SJames Collins            $page_regex = '/(.*)/';
15309cff245bSJames Collins            if (stripos($str, '<pre') !== false) {
15311785fc73SJames Collins                $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/';
15321785fc73SJames Collins            }
15331785fc73SJames Collins
15341785fc73SJames Collins            $content = preg_replace_callback($page_regex, function ($icons) {
1535a2005a27SJames Collins                $iconTag = $this->getConf('iconTag', 'icon');
1536a2005a27SJames Collins
153710b40067Snomadjimbob                return preg_replace_callback(
153810b40067Snomadjimbob                    '/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
1539ab45ba71SJames Collins                    function ($matches) {
1540ab45ba71SJames Collins                        global $MIKIO_ICONS;
1541ab45ba71SJames Collins
1542ab45ba71SJames Collins                        $s = $matches[0];
1543ab45ba71SJames Collins
1544ab45ba71SJames Collins                        if (count($MIKIO_ICONS) > 0) {
1545ab45ba71SJames Collins                            $icon = $MIKIO_ICONS[0];
1546ab45ba71SJames Collins
1547ab45ba71SJames Collins                            if (count($matches) > 1) {
1548ab45ba71SJames Collins                                $e = explode(' ', $matches[1]);
1549ab45ba71SJames Collins
1550ab45ba71SJames Collins                                if (count($e) > 1) {
1551ab45ba71SJames Collins                                    foreach ($MIKIO_ICONS as $iconItem) {
15529cff245bSJames Collins                                        if (strcasecmp($iconItem['name'], $e[0]) === 0) {
1553ab45ba71SJames Collins                                            $icon = $iconItem;
1554ab45ba71SJames Collins
1555ab45ba71SJames Collins                                            $s = $icon['insert'];
1556ab45ba71SJames Collins                                            for ($i = 1; $i < 9; $i++) {
15571cdedf28SJames Collins                                                if (count($e) < $i || empty($e[$i]) === true) {
15589cff245bSJames Collins                                                    if (isset($icon['$' . $i]) === true) {
1559ab45ba71SJames Collins                                                        $s = str_replace('$' . $i, $icon['$' . $i], $s);
1560ab45ba71SJames Collins                                                    }
1561ab45ba71SJames Collins                                                } else {
1562ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $e[$i], $s);
1563ab45ba71SJames Collins                                                }
1564ab45ba71SJames Collins                                            }
1565ab45ba71SJames Collins
1566ab45ba71SJames Collins                                            $dir = '';
15679cff245bSJames Collins                                            if (isset($icon['dir']) === true) {
15689cff245bSJames Collins                                                $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
15699cff245bSJames Collins                                            }
1570ab45ba71SJames Collins
1571ab45ba71SJames Collins                                            $s = str_replace('$0', $dir, $s);
1572ab45ba71SJames Collins
1573ab45ba71SJames Collins                                            break;
15749cff245bSJames Collins                                        }//end if
15759cff245bSJames Collins                                    }//end foreach
1576ab45ba71SJames Collins                                } else {
1577ab45ba71SJames Collins                                    $s = str_replace('$1', $matches[1], $icon['insert']);
15789cff245bSJames Collins                                }//end if
15799cff245bSJames Collins                            }//end if
15809cff245bSJames Collins                        }//end if
158175adba86SJames Collins
1582ab45ba71SJames Collins                        $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
15839cff245bSJames Collins                        if ($count === 0) {
1584ab45ba71SJames Collins                            $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
1585ab45ba71SJames Collins                        }
1586ab45ba71SJames Collins
1587ab45ba71SJames Collins                        return $s;
1588ab45ba71SJames Collins                    },
158910b40067Snomadjimbob                    $icons[0]
159010b40067Snomadjimbob                );
1591a2005a27SJames Collins            }, $content);
1592a2005a27SJames Collins
15933a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15949cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1595a2005a27SJames Collins                    $preview[0]->innertext = $content;
1596a2005a27SJames Collins                }
1597a2005a27SJames Collins
1598a2005a27SJames Collins                $str = $html->save();
1599a2005a27SJames Collins                $html->clear();
1600a2005a27SJames Collins                unset($html);
1601a2005a27SJames Collins            } else {
1602a2005a27SJames Collins                $str = $content;
1603a2005a27SJames Collins            }
16049cff245bSJames Collins        }//end if
1605ab45ba71SJames Collins
1606ab45ba71SJames Collins        return $str;
1607ab45ba71SJames Collins    }
160847161538SJames Collins
1609c165b184SJames Collins    /**
1610a8eebd82SJames Collins     * Parse HTML for theme
1611c165b184SJames Collins     *
16129cff245bSJames Collins     * @param   string $content HTML content to parse.
1613a8eebd82SJames Collins     * @return  string          Parsed content
1614c165b184SJames Collins     */
16159cff245bSJames Collins    public function parseContent(string $content)
161610b40067Snomadjimbob    {
1617ab45ba71SJames Collins        global $INPUT, $ACT;
1618ab45ba71SJames Collins
1619a8eebd82SJames Collins        // Add Mikio Section titles
16203a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
16219cff245bSJames Collins            $admin_sections = [
1622ab45ba71SJames Collins                // Section      Insert Before                 Icon
16239cff245bSJames Collins                'navbar'        => ['navbarUseTitleIcon',      ''],
16249cff245bSJames Collins                'search'        => ['searchButton',            ''],
16259cff245bSJames Collins                'hero'          => ['heroTitle',               ''],
16269cff245bSJames Collins                'tags'          => ['tagsConsolidate',         ''],
16279cff245bSJames Collins                'breadcrumb'    => ['breadcrumbHideHome',      ''],
16289cff245bSJames Collins                'youarehere'    => ['youarehereHideHome',      ''],
16299cff245bSJames Collins                'sidebar'       => ['sidebarShowLeft',         ''],
16309cff245bSJames Collins                'toc'           => ['tocFull',                 ''],
16319cff245bSJames Collins                'pagetools'     => ['pageToolsFloating',       ''],
16329cff245bSJames Collins                'footer'        => ['footerCustomMenuText',    ''],
16339cff245bSJames Collins                'license'       => ['licenseType',             ''],
16349cff245bSJames Collins                'acl'           => ['includePageUseACL',       ''],
16359cff245bSJames Collins                'sticky'        => ['stickyTopHeader',         ''],
16369cff245bSJames Collins            ];
1637ab45ba71SJames Collins
1638ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
1639ab45ba71SJames Collins                $search = $items[0];
1640ab45ba71SJames Collins                $icon   = $items[1];
1641ab45ba71SJames Collins
164210b40067Snomadjimbob                $content = preg_replace(
1643adf52ebbSJames Collins                    '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/',
16449cff245bSJames Collins                    '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) .
16459cff245bSJames Collins                        tpl_getLang('config_' . $section) .
16469cff245bSJames Collins                        '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' .
16479cff245bSJames Collins                        $search . '</span>',
164810b40067Snomadjimbob                    $content
164910b40067Snomadjimbob                );
1650ab45ba71SJames Collins            }
1651bb5a3dd1SJames Collins        } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) {
1652ad182e6dSnomadjimbob            $mikioPluginMissing = true;
1653ad182e6dSnomadjimbob            /* Hide plugin fields if not installed */
1654*9ffe9161Snomadjimbob            if (plugin_load('action', 'mikioplugin') !== null) {
1655ad182e6dSnomadjimbob                $mikioPluginMissing = false;
1656ad182e6dSnomadjimbob            }
1657ad182e6dSnomadjimbob
1658cee81679SJames Collins            $style_headers = [
1659f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__text_'],
1660f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__code_'],
1661f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__control_'],
1662f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__topheader_'],
1663f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__navbar_'],
1664f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar_'],
1665f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__tag_background_color_'],
1666f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb_'],
1667f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__hero_'],
1668f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__sidebar_'],
1669f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__content_'],
1670f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__toc_'],
1671f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__pagetools_'],
1672f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__footer_'],
1673f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__table_'],
1674f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__dropdown_'],
1675f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__section_edit_'],
1676f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__tree_'],
1677f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__tab_'],
1678ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin', 'starts_with' => '__plugin_', 'heading' => 'h2',
1679*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1680*9ffe9161Snomadjimbob                ],
1681ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_primary_', 'hidden' => $mikioPluginMissing],
1682ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_secondary_',
1683*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1684*9ffe9161Snomadjimbob                ],
1685ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_success_', 'hidden' => $mikioPluginMissing],
1686ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_danger_', 'hidden' => $mikioPluginMissing],
1687ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_warning_', 'hidden' => $mikioPluginMissing],
1688ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_info_', 'hidden' => $mikioPluginMissing],
1689ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_light_', 'hidden' => $mikioPluginMissing],
1690ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_dark_', 'hidden' => $mikioPluginMissing],
1691ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_link_', 'hidden' => $mikioPluginMissing],
1692ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_carousel_', 'hidden' => $mikioPluginMissing],
1693ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_steps_', 'hidden' => $mikioPluginMissing],
1694ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_tabgroup_', 'hidden' => $mikioPluginMissing],
1695ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_tooltip_', 'hidden' => $mikioPluginMissing],
1696cee81679SJames Collins                ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'],
1697f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__darkmode_text_'],
1698f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__darkmode_code_'],
1699f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__darkmode_control_'],
1700f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__darkmode_topheader_'],
1701f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar_'],
1702f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar_'],
1703f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color_'],
1704f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb_'],
1705f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__darkmode_hero_'],
1706f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar_'],
1707f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__darkmode_content_'],
1708f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__darkmode_toc_'],
1709f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools_'],
1710f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__darkmode_footer_'],
1711f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__darkmode_table_'],
1712f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown_'],
1713f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit_'],
1714f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__darkmode_tree_'],
1715f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__darkmode_tab_'],
1716ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin (Dark mode)', 'starts_with' => '__plugin_darkmode_', 'heading' => 'h2',
1717*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1718*9ffe9161Snomadjimbob                ],
1719ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_darkmode_primary_',
1720*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1721*9ffe9161Snomadjimbob                ],
1722ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_darkmode_secondary_',
1723*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1724*9ffe9161Snomadjimbob                ],
1725ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_darkmode_success_',
1726*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1727*9ffe9161Snomadjimbob                ],
1728ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_darkmode_danger_',
1729*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1730*9ffe9161Snomadjimbob                ],
1731ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_darkmode_warning_',
1732*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1733*9ffe9161Snomadjimbob                ],
1734ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_darkmode_info_',
1735*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1736*9ffe9161Snomadjimbob                ],
1737ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_darkmode_light_',
1738*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1739*9ffe9161Snomadjimbob                ],
1740ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_darkmode_dark_',
1741*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1742*9ffe9161Snomadjimbob                ],
1743ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_darkmode_link_',
1744*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1745*9ffe9161Snomadjimbob                ],
1746ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_darkmode_carousel_',
1747*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1748*9ffe9161Snomadjimbob                ],
1749ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_darkmode_steps_', 'hidden' => $mikioPluginMissing],
1750ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_darkmode_tabgroup_',
1751*9ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
1752*9ffe9161Snomadjimbob                ],
1753ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_darkmode_tooltip_', 'hidden' => $mikioPluginMissing],
1754cee81679SJames Collins            ];
1755cee81679SJames Collins
1756cee81679SJames Collins            foreach ($style_headers as $header) {
1757cee81679SJames Collins                if (array_key_exists('heading', $header) === false) {
1758cee81679SJames Collins                    $header['heading'] = 'h3';
1759cee81679SJames Collins                }
1760cee81679SJames Collins
1761ad182e6dSnomadjimbob                if (array_key_exists('hidden', $header) === false) {
1762ad182e6dSnomadjimbob                    $header['hidden'] = false;
1763ad182e6dSnomadjimbob                }
1764ad182e6dSnomadjimbob
17651244e3ceSJames Collins                $content = preg_replace(
1766f65a4e5eSJames Collins                    '/(<tr>\s*<td>\s*<label for="tpl__' . $header['starts_with'] . '.+?<\/tr>)/s',
1767*9ffe9161Snomadjimbob                    '</tbody></table><' . $header['heading'] . ' style="display:' .
1768*9ffe9161Snomadjimbob                    ($header['hidden'] === true ? 'none' : 'block') . '">' .
1769*9ffe9161Snomadjimbob                    $header['title'] . '</' . $header['heading'] . '>
1770ad182e6dSnomadjimbob                    <table style="display:' . ($header['hidden'] === true ? 'none' : 'table') . '"><tbody>$1',
17711244e3ceSJames Collins                    $content,
17721244e3ceSJames Collins                    1
17731244e3ceSJames Collins                );
1774cee81679SJames Collins            }
1775f65a4e5eSJames Collins
1776f65a4e5eSJames Collins            $content = preg_replace('/type="color"/', 'type="text"', $content);
1777bb5a3dd1SJames Collins        }//end if
1778ab45ba71SJames Collins
17793a385f2cSJames Collins        if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
1780a8eebd82SJames Collins            $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content);
1781a8eebd82SJames Collins        }
1782ab45ba71SJames Collins
1783a8eebd82SJames Collins        // Page Revisions - Table Fix
17849cff245bSJames Collins        if (strpos($content, 'id="page__revisions"') !== false) {
17859cff245bSJames Collins            $content = preg_replace(
17869cff245bSJames Collins                '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/',
17879cff245bSJames Collins                '<span>$1</span>',
17889cff245bSJames Collins                $content
17899cff245bSJames Collins            );
1790a8eebd82SJames Collins        }
1791ab45ba71SJames Collins
17929cff245bSJames Collins        $html = new \simple_html_dom();
1793bc1032d9SJames Collins        $html->stripRNAttrValues = false;
1794c165b184SJames Collins        $html->load($content, true, false);
1795c165b184SJames Collins
17969cff245bSJames Collins        if ($html === false) {
17979cff245bSJames Collins            return $content;
17989cff245bSJames Collins        }
1799ab45ba71SJames Collins
1800ab45ba71SJames Collins        /* Buttons */
1801ab45ba71SJames Collins        foreach ($html->find('#config__manager button') as $node) {
1802ab45ba71SJames Collins            $c = explode(' ', $node->class);
18039cff245bSJames Collins            if (in_array('mikio-button', $c) === false) {
18049cff245bSJames Collins                $c[] = 'mikio-button';
18059cff245bSJames Collins            }
1806ab45ba71SJames Collins            $node->class = implode(' ', $c);
1807c165b184SJames Collins        }
1808c165b184SJames Collins
1809ab45ba71SJames Collins
1810ab45ba71SJames Collins        /* Buttons - Primary */
1811ab45ba71SJames Collins        foreach ($html->find('#config__manager [type=submit]') as $node) {
1812ab45ba71SJames Collins            $c = explode(' ', $node->class);
18139cff245bSJames Collins            if (in_array('mikio-primary', $c) === false) {
18149cff245bSJames Collins                $c[] = 'mikio-primary';
18159cff245bSJames Collins            }
1816ab45ba71SJames Collins            $node->class = implode(' ', $c);
1817ab45ba71SJames Collins        }
1818ab45ba71SJames Collins
1819a8eebd82SJames Collins        /* Hide page title if hero is enabled */
18209cff245bSJames Collins        if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
18211785fc73SJames Collins            $pageTitle = $this->parsePageTitle();
182247161538SJames Collins
182347161538SJames Collins            foreach ($html->find('h1,h2,h3,h4') as $elm) {
18249cff245bSJames Collins                if ($elm->innertext === $pageTitle) {
1825a8eebd82SJames Collins                    // $elm->innertext = '';
1826a8eebd82SJames Collins                    $elm->setAttribute('style', 'display:none');
1827a8eebd82SJames Collins
182847161538SJames Collins                    break;
182947161538SJames Collins                }
183047161538SJames Collins            }
183147161538SJames Collins        }
1832c165b184SJames Collins
1833a8eebd82SJames Collins        /* Hero subtitle */
18342b4583abSJames Collins        foreach ($html->find('p') as $elm) {
18352b4583abSJames Collins            $i = stripos($elm->innertext, '~~hero-subtitle');
18362b4583abSJames Collins            if ($i !== false) {
18379cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
18382b4583abSJames Collins                if ($j !== false) {
18399cff245bSJames Collins                    if ($j > ($i + 16)) {
18409cff245bSJames Collins                        $subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16));
1841a8eebd82SJames Collins                        $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
1842a8eebd82SJames Collins
1843a8eebd82SJames Collins                        // $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2);
1844a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext);
18452b4583abSJames Collins                    }
18462b4583abSJames Collins
18472b4583abSJames Collins                    break;
18482b4583abSJames Collins                }
18492b4583abSJames Collins            }
18502b4583abSJames Collins        }
18512b4583abSJames Collins
1852a8eebd82SJames Collins        /* Hero image */
1853a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1854a8eebd82SJames Collins            $image = '';
1855a8eebd82SJames Collins            preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches);
1856a8eebd82SJames Collins            if (count($matches) > 0) {
1857a8eebd82SJames Collins                preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches);
1858a8eebd82SJames Collins                if (count($imageTagMatches) > 0) {
1859a8eebd82SJames Collins                    $image = $imageTagMatches[1];
1860a8eebd82SJames Collins                } else {
1861a8eebd82SJames Collins                    preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches);
1862a8eebd82SJames Collins                    if (count($imageTagMatches) > 0) {
1863a8eebd82SJames Collins                        $image = $imageTagMatches[1];
1864a8eebd82SJames Collins                    } else {
1865a8eebd82SJames Collins                        $image = strip_tags($matches[1]);
18669cff245bSJames Collins                        if (stripos($image, ':') === false) {
18679cff245bSJames Collins                            $image = str_replace(['{', '}'], '', $image);
1868a8eebd82SJames Collins                            $i = stripos($image, '?');
18699cff245bSJames Collins                            if ($i !== false) {
1870a8eebd82SJames Collins                                $image = substr($image, 0, $i);
1871c165b184SJames Collins                            }
1872c165b184SJames Collins
1873a8eebd82SJames Collins                            $image = ml($image, '', true, '', false);
1874ab45ba71SJames Collins                        }
1875ab45ba71SJames Collins                    }
1876ab45ba71SJames Collins                }
1877ab45ba71SJames Collins
1878a8eebd82SJames Collins                $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
1879a8eebd82SJames Collins
1880a8eebd82SJames Collins                $elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext);
18819cff245bSJames Collins            }//end if
18829cff245bSJames Collins        }//end foreach
1883ab45ba71SJames Collins
18849cff245bSJames Collins        /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
18859cff245bSJames Collins        [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
1886a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1887a8eebd82SJames Collins            $i = stripos($elm->innertext, '~~hero-colors');
1888a8eebd82SJames Collins            if ($i !== false) {
18899cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
1890a8eebd82SJames Collins                if ($j !== false) {
18919cff245bSJames Collins                    if ($j > ($i + 14)) {
18929cff245bSJames Collins                        $color = substr($elm->innertext, ($i + 14), ($j - $i - 14));
1893a8eebd82SJames Collins                        $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')';
1894ab45ba71SJames Collins
1895a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext);
1896ab45ba71SJames Collins                    }
1897ab45ba71SJames Collins
1898a8eebd82SJames Collins                    break;
1899ab45ba71SJames Collins                }
1900ab45ba71SJames Collins            }
1901ab45ba71SJames Collins        }
1902ab45ba71SJames Collins
190396ec8e1eSJames Collins        /* Hide parts - ~~hide-parts [parts]~~  */
190496ec8e1eSJames Collins        foreach ($html->find('p') as $elm) {
190596ec8e1eSJames Collins            $i = stripos($elm->innertext, '~~hide-parts');
190696ec8e1eSJames Collins            if ($i !== false) {
19079cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
190896ec8e1eSJames Collins                if ($j !== false) {
19099cff245bSJames Collins                    if ($j > ($i + 13)) {
19109cff245bSJames Collins                        $parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13)));
191196ec8e1eSJames Collins                        $script = '';
191296ec8e1eSJames Collins
191396ec8e1eSJames Collins                        foreach ($parts as $part) {
191496ec8e1eSJames Collins                            // $part = trim($part);
191596ec8e1eSJames Collins                            if (strlen($part) > 0) {
191696ec8e1eSJames Collins                                $script .= 'mikio.hidePart(\'' . $part . '\');';
191796ec8e1eSJames Collins                            }
191896ec8e1eSJames Collins                        }
191996ec8e1eSJames Collins
192096ec8e1eSJames Collins                        if (strlen($script) > 0) {
192196ec8e1eSJames Collins                            $this->footerScript['hide-parts'] = $script;
192296ec8e1eSJames Collins                        }
192396ec8e1eSJames Collins
192496ec8e1eSJames Collins                        $elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext);
192596ec8e1eSJames Collins                    }
192696ec8e1eSJames Collins
192796ec8e1eSJames Collins                    break;
19289cff245bSJames Collins                }//end if
19299cff245bSJames Collins            }//end if
19309cff245bSJames Collins        }//end foreach
193196ec8e1eSJames Collins
193296ec8e1eSJames Collins
1933a8eebd82SJames Collins        /* Page Tags (tag plugin) */
19349cff245bSJames Collins        if ($this->getConf('tagsConsolidate') === true) {
1935a8eebd82SJames Collins            $tags = '';
1936a8eebd82SJames Collins            foreach ($html->find('div.tags a') as $elm) {
1937a8eebd82SJames Collins                $tags .= $elm->outertext;
1938a8eebd82SJames Collins            }
1939a8eebd82SJames Collins
1940a8eebd82SJames Collins            foreach ($html->find('div.tags') as $elm) {
1941a8eebd82SJames Collins                $elm->innertext = '';
1942a8eebd82SJames Collins                $elm->setAttribute('style', 'display:none');
1943a8eebd82SJames Collins            }
1944a8eebd82SJames Collins
19453a385f2cSJames Collins            if (empty($tags) === false) {
1946a8eebd82SJames Collins                $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
1947a8eebd82SJames Collins            }
1948ab45ba71SJames Collins        }
1949ab45ba71SJames Collins
1950ab45ba71SJames Collins        // Configuration Manager
19513a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
1952ab45ba71SJames Collins            // Additional save buttons
1953ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
1954ab45ba71SJames Collins                $saveButtons = '';
1955ab45ba71SJames Collins
1956ab45ba71SJames Collins                foreach ($cm->find('p') as $elm) {
1957ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
1958a8eebd82SJames Collins                    $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons);
1959ab45ba71SJames Collins                    $elm->outertext = '';
1960ab45ba71SJames Collins                }
1961ab45ba71SJames Collins
1962ab45ba71SJames Collins                foreach ($cm->find('fieldset') as $elm) {
1963ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
1964ab45ba71SJames Collins                }
1965ab45ba71SJames Collins            }
1966ab45ba71SJames Collins        }
1967ab45ba71SJames Collins
1968ab45ba71SJames Collins        $content = $html->save();
1969c165b184SJames Collins        $html->clear();
1970c165b184SJames Collins        unset($html);
1971c165b184SJames Collins
1972c165b184SJames Collins        return $content;
1973c165b184SJames Collins    }
19742b4583abSJames Collins
19752b4583abSJames Collins
1976a8eebd82SJames Collins    /**
1977a8eebd82SJames Collins     * Get DokuWiki namespace/page/URI as link
1978a8eebd82SJames Collins     *
19799cff245bSJames Collins     * @param   string $str String to parse.
19809cff245bSJames Collins     * @return  string      parsed URI
1981a8eebd82SJames Collins     */
19829cff245bSJames Collins    public function getLink(string $str)
198310b40067Snomadjimbob    {
19842b4583abSJames Collins        $i = strpos($str, '://');
19859cff245bSJames Collins        if ($i !== false) {
19869cff245bSJames Collins            return $str;
19879cff245bSJames Collins        }
19882b4583abSJames Collins
19892b4583abSJames Collins        return wl($str);
19902b4583abSJames Collins    }
1991ab45ba71SJames Collins
1992ab45ba71SJames Collins
1993a8eebd82SJames Collins    /**
1994a8eebd82SJames Collins     * Check if the user can edit current namespace/page
1995a8eebd82SJames Collins     *
1996a8eebd82SJames Collins     * @return  boolean  user can edit
1997a8eebd82SJames Collins     */
199810b40067Snomadjimbob    public function userCanEdit()
199910b40067Snomadjimbob    {
2000ab45ba71SJames Collins        global $INFO;
2001ab45ba71SJames Collins        global $ID;
2002ab45ba71SJames Collins
2003ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
20049cff245bSJames Collins        if (@file_exists($wiki_file) === false) {
20059cff245bSJames Collins            return true;
20069cff245bSJames Collins        }
20079cff245bSJames Collins        if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
20089cff245bSJames Collins            return true;
20099cff245bSJames Collins        }
2010a8eebd82SJames Collins        // $meta_file = metaFN($ID, '.meta');
20119cff245bSJames Collins        if ($INFO['meta']['user'] === false) {
20129cff245bSJames Collins            return true;
20139cff245bSJames Collins        }
20149cff245bSJames Collins        if ($INFO['client'] === $INFO['meta']['user']) {
20159cff245bSJames Collins            return true;
20169cff245bSJames Collins        }
2017ab45ba71SJames Collins
2018ab45ba71SJames Collins        return false;
2019c165b184SJames Collins    }
202047161538SJames Collins
202147161538SJames Collins
2022a8eebd82SJames Collins    /**
2023a8eebd82SJames Collins     * Search for and return the uri of a media file
2024a8eebd82SJames Collins     *
20259cff245bSJames Collins     * @param string  $image           Image name to search for (without extension).
20269cff245bSJames Collins     * @param boolean $searchCurrentNS Search the current namespace.
20279cff245bSJames Collins     * @param boolean $propagate       Propagate search through the namespace.
20289cff245bSJames Collins     * @return string                  URI of the found media file
2029a8eebd82SJames Collins     */
20309cff245bSJames Collins    public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
203110b40067Snomadjimbob    {
2032ab45ba71SJames Collins        global $INFO;
2033a8eebd82SJames Collins
20349cff245bSJames Collins        $ext = ['png', 'jpg', 'gif', 'svg'];
2035ab45ba71SJames Collins
20369cff245bSJames Collins        if ($searchCurrentNS === true) {
20379cff245bSJames Collins            $prefix[] = ':' . $INFO['namespace'] . ':';
20389cff245bSJames Collins        }
20399cff245bSJames Collins        if ($propagate === true) {
2040ab45ba71SJames Collins            $prefix[] = ':';
2041ab45ba71SJames Collins            $prefix[] = ':wiki:';
2042a8eebd82SJames Collins        }
2043ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
20443a385f2cSJames Collins        if (empty($theme) === false) {
20459cff245bSJames Collins            $prefix[] = 'themes/' . $theme . '/images/';
20469cff245bSJames Collins        }
2047ab45ba71SJames Collins        $prefix[] = 'images/';
2048ab45ba71SJames Collins
20499cff245bSJames Collins        $search = [];
2050ab45ba71SJames Collins        foreach ($prefix as $pitem) {
2051ab45ba71SJames Collins            foreach ($ext as $eitem) {
2052ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
2053ab45ba71SJames Collins            }
2054ab45ba71SJames Collins        }
2055ab45ba71SJames Collins
2056ab45ba71SJames Collins        $img = '';
2057ab45ba71SJames Collins        $file = '';
2058ab45ba71SJames Collins        $url = '';
2059ab45ba71SJames Collins        $ismedia = false;
2060ab45ba71SJames Collins        $found = false;
2061ab45ba71SJames Collins
2062ab45ba71SJames Collins        foreach ($search as $img) {
20633a385f2cSJames Collins            if (strcasecmp(substr($img, 0, 1), ':') === 0) {
2064ab45ba71SJames Collins                $file    = mediaFN($img);
2065ab45ba71SJames Collins                $ismedia = true;
2066ab45ba71SJames Collins            } else {
2067ab45ba71SJames Collins                $file    = tpl_incdir() . $img;
2068ab45ba71SJames Collins                $ismedia = false;
2069ab45ba71SJames Collins            }
2070ab45ba71SJames Collins
20719cff245bSJames Collins            if (file_exists($file) === true) {
2072ab45ba71SJames Collins                $found = true;
2073ab45ba71SJames Collins                break;
2074ab45ba71SJames Collins            }
2075ab45ba71SJames Collins        }
2076ab45ba71SJames Collins
20779cff245bSJames Collins        if ($found === false) {
20789cff245bSJames Collins            return false;
20799cff245bSJames Collins        }
2080ab45ba71SJames Collins
20819cff245bSJames Collins        if ($ismedia === true) {
2082ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
2083ab45ba71SJames Collins        } else {
2084ab45ba71SJames Collins            $url = tpl_basedir() . $img;
2085ab45ba71SJames Collins        }
2086ab45ba71SJames Collins
2087ab45ba71SJames Collins        return $url;
2088ab45ba71SJames Collins    }
2089ab45ba71SJames Collins
2090a8eebd82SJames Collins
2091a8eebd82SJames Collins    /**
2092ab45ba71SJames Collins     * Print or return the page title
2093ab45ba71SJames Collins     *
20949cff245bSJames Collins     * @param string $page Page id or empty string for current page.
2095ab45ba71SJames Collins     * @return string      generated content
2096ab45ba71SJames Collins     */
20979cff245bSJames Collins    public function getPageTitle(string $page = '')
209810b40067Snomadjimbob    {
2099ab45ba71SJames Collins        global $ID, $conf;
2100ab45ba71SJames Collins
2101ab45ba71SJames Collins        $html = '';
2102ab45ba71SJames Collins
21033a385f2cSJames Collins        if (empty($page) === true) {
21049cff245bSJames Collins            $page = $ID;
21059cff245bSJames Collins        }
2106ab45ba71SJames Collins
2107ab45ba71SJames Collins        $html = p_get_first_heading($page);
2108ab45ba71SJames Collins        $html = strip_tags($html);
2109ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
2110ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
2111ab45ba71SJames Collins        $html = trim($html);
2112ab45ba71SJames Collins
2113ab45ba71SJames Collins        return $html;
2114ab45ba71SJames Collins    }
2115a8eebd82SJames Collins
2116a8eebd82SJames Collins
2117a8eebd82SJames Collins    /**
2118a8eebd82SJames Collins     * Return inline theme icon
2119a8eebd82SJames Collins     *
21209cff245bSJames Collins     * @param   string $type  Icon to retreive.
21219e41d878SJames Collins     * @param   string $class Classname to insert.
21229cff245bSJames Collins     * @return  string        HTML icon content
2123a8eebd82SJames Collins     */
21249e41d878SJames Collins    public function mikioInlineIcon(string $type, string $class = "")
212510b40067Snomadjimbob    {
21269e41d878SJames Collins        if (is_array($class) === true) {
21279e41d878SJames Collins            $class = explode(' ', $class);
21289e41d878SJames Collins        }
21299e41d878SJames Collins
21309e41d878SJames Collins        if (strlen($class) > 0) {
21319e41d878SJames Collins            $class = ' ' . $class;
21329e41d878SJames Collins        }
21339e41d878SJames Collins
2134a8eebd82SJames Collins        switch ($type) {
2135a8eebd82SJames Collins            case 'wrench':
2136906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792
2137906e1a13SJames 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,
2138906e1a13SJames 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,
2139906e1a13SJames 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,
2140906e1a13SJames 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
2141906e1a13SJames 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,
2142906e1a13SJames 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>';
2143a8eebd82SJames Collins            case 'file':
2144906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2145906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991">
2146906e1a13SJames 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
2147906e1a13SJames 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
2148906e1a13SJames 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"
21499cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
2150a8eebd82SJames Collins            case 'gear':
2151906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2152906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027">
2153906e1a13SJames 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
2154906e1a13SJames 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
2155906e1a13SJames 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
2156906e1a13SJames 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
2157906e1a13SJames 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
2158906e1a13SJames 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,
2159906e1a13SJames 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
2160906e1a13SJames 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
2161906e1a13SJames 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" />
2162906e1a13SJames Collins</g></svg>';
2163a8eebd82SJames Collins            case 'user':
2164906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2165906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M
2166906e1a13SJames 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
2167906e1a13SJames 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,
2168906e1a13SJames 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
2169906e1a13SJames 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
2170906e1a13SJames 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,
2171906e1a13SJames Collins1408 863,1408 975.5,1295.5 1088,1183 1088,1024 z"/></g></svg>';
2172a8eebd82SJames Collins            case 'search':
21739e41d878SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
21749cff245bSJames 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
21759cff245bSJames 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
21769cff245bSJames 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
21779cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>';
2178a8eebd82SJames Collins            case 'home':
2179906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2180906e1a13SJames CollinsviewBox="0 -256 1792 1792" aria-hidden="true" style="fill:currentColor"><g
2181906e1a13SJames 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
2182906e1a13SJames 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
2183906e1a13SJames 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
2184906e1a13SJames 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,
2185906e1a13SJames 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"
21869cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
21879e41d878SJames Collins            case 'sun':
2188906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2189906e1a13SJames 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
2190906e1a13SJames 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
2191906e1a13SJames 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
2192906e1a13SJames 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
2193906e1a13SJames Collins0 0 1-.707.707z" /></svg>';
21949e41d878SJames Collins            case 'moon':
2195906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2196906e1a13SJames 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
2197906e1a13SJames 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
2198906e1a13SJames 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
2199906e1a13SJames 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
2200906e1a13SJames Collins0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>';
2201f65a4e5eSJames Collins            case 'hamburger':
2202f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
2203f65a4e5eSJames 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
2204f65a4e5eSJames 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
2205f65a4e5eSJames 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
2206f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16z"/></svg>';
2207f65a4e5eSJames Collins            case 'down-arrow':
2208f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
2209f65a4e5eSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M16.003 18.626l7.081-7.081L25 13.46l-8.997 8.998-9.003-9
2210f65a4e5eSJames Collins1.917-1.916z"/></svg>';
22119cff245bSJames Collins        }//end switch
2212ab45ba71SJames Collins
2213a8eebd82SJames Collins        return '';
2214a8eebd82SJames Collins    }
2215ab45ba71SJames Collins
2216a8eebd82SJames Collins    /**
2217a8eebd82SJames Collins     * Finalize theme
22189cff245bSJames Collins     *
22199cff245bSJames Collins     * @return void
2220a8eebd82SJames Collins     */
222110b40067Snomadjimbob    public function finalize()
222210b40067Snomadjimbob    {
2223a8eebd82SJames Collins    }
22241785fc73SJames Collins
22251785fc73SJames Collins    /**
22261785fc73SJames Collins     * Show Messages
22279cff245bSJames Collins     *
22289cff245bSJames Collins     * @return void
22291785fc73SJames Collins     */
223010b40067Snomadjimbob    public function showMessages()
223110b40067Snomadjimbob    {
22321785fc73SJames Collins        global $ACT;
22331785fc73SJames Collins
22349cff245bSJames Collins        if ($this->lessIgnored === true) {
22359cff245bSJames Collins            msg(
22369cff245bSJames Collins                'useLESS is enabled on the Mikio template, however is not supported on this server',
22379cff245bSJames Collins                2,
22389cff245bSJames Collins                '',
22399cff245bSJames Collins                '',
22409cff245bSJames Collins                MSG_ADMINS_ONLY
22419cff245bSJames Collins            );
2242a8df40efSJames Collins        }
2243a8df40efSJames Collins
22441785fc73SJames Collins        $show = $this->getConf('showNotifications');
22453a385f2cSJames Collins        if (
22463a385f2cSJames Collins            strcasecmp($show, 'always') === 0 ||
22473a385f2cSJames Collins            (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
22483a385f2cSJames Collins        ) {
22491785fc73SJames Collins            global $MSG, $MSG_shown;
22501785fc73SJames Collins
22519cff245bSJames Collins            if (isset($MSG) === false) {
22521785fc73SJames Collins                return;
22531785fc73SJames Collins            }
22541785fc73SJames Collins
22559cff245bSJames Collins            if (isset($MSG_shown) === false) {
22569cff245bSJames Collins                $MSG_shown = [];
2257a8df40efSJames Collins            }
22581785fc73SJames Collins
22591785fc73SJames Collins            foreach ($MSG as $msg) {
22601785fc73SJames Collins                $hash = md5($msg['msg']);
22619cff245bSJames Collins                if (isset($MSG_shown[$hash]) === true) {
22621785fc73SJames Collins                    continue;
22631785fc73SJames Collins                }
22641785fc73SJames Collins                // skip double messages
22651785fc73SJames Collins
22669cff245bSJames Collins                if (info_msg_allowed($msg) === true) {
22679cff245bSJames Collins                    echo '<div class="' . $msg['lvl'] . '">';
22689cff245bSJames Collins                    echo $msg['msg'];
22699cff245bSJames Collins                    echo '</div>';
22701785fc73SJames Collins                }
22711785fc73SJames Collins
2272a8df40efSJames Collins                $MSG_shown[$hash] = true;
22731785fc73SJames Collins            }
22741785fc73SJames Collins
22751785fc73SJames Collins            unset($GLOBALS['MSG']);
22769cff245bSJames Collins        }//end if
22771785fc73SJames Collins    }
22787ac0a6efSJames Collins
22797ac0a6efSJames Collins    /**
22807ac0a6efSJames Collins     * Dokuwiki version
22817ac0a6efSJames Collins     *
22827ac0a6efSJames Collins     * @return  string        the dw version name
22837ac0a6efSJames Collins     */
22849cff245bSJames Collins    public function dwVersion()
22859cff245bSJames Collins    {
22869cff245bSJames Collins        if (function_exists('getVersionData') === true) {
22877ac0a6efSJames Collins            $version_data = getVersionData();
22889cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
22897ac0a6efSJames Collins                $version_items = explode(' ', $version_data['date']);
22907ac0a6efSJames Collins                if (count($version_items) >= 2) {
22917ac0a6efSJames Collins                    return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
22927ac0a6efSJames Collins                }
22937ac0a6efSJames Collins            }
22947ac0a6efSJames Collins        }
22957ac0a6efSJames Collins
22967ac0a6efSJames Collins        return 'unknown';
22977ac0a6efSJames Collins    }
2298e4c4fb13SJames Collins
2299e4c4fb13SJames Collins    /**
2300e4c4fb13SJames Collins     * Dokuwiki version number
2301e4c4fb13SJames Collins     *
2302e4c4fb13SJames Collins     * @return  string        the dw version date converted to integer
2303e4c4fb13SJames Collins     */
23049cff245bSJames Collins    public function dwVersionNumber()
23059cff245bSJames Collins    {
23069cff245bSJames Collins        if (function_exists('getVersionData') === true) {
2307e4c4fb13SJames Collins            $version_data = getVersionData();
23089cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
2309e4c4fb13SJames Collins                $version_items = explode(' ', $version_data['date']);
2310e4c4fb13SJames Collins                if (count($version_items) >= 1) {
2311e4c4fb13SJames Collins                    return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
2312e4c4fb13SJames Collins                }
2313e4c4fb13SJames Collins            }
2314e4c4fb13SJames Collins        }
2315e4c4fb13SJames Collins
2316e4c4fb13SJames Collins        return 0;
2317e4c4fb13SJames Collins    }
2318a8eebd82SJames Collins}
2319ab45ba71SJames Collins
2320ab45ba71SJames Collinsglobal $TEMPLATE;
232147161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
2322