xref: /template/mikio/mikio.php (revision 3a44a74a27a7ca54aa2ef1373b4b56e5ca4392a8)
1c165b184SJames Collins<?php
210b40067Snomadjimbob
3c165b184SJames Collins/**
4c165b184SJames Collins * DokuWiki Mikio Template
5c165b184SJames Collins *
6c165b184SJames Collins * @link    http://dokuwiki.org/template:mikio
7c165b184SJames Collins * @author  James Collins <james.collins@outlook.com.au>
8ab45ba71SJames Collins * @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html)
9c165b184SJames Collins */
1010b40067Snomadjimbob
11ab45ba71SJames Collinsnamespace dokuwiki\template\mikio;
12c165b184SJames Collins
139cff245bSJames Collinsif (defined('DOKU_INC') === false) {
149cff245bSJames Collins    die();
159cff245bSJames Collins}
16c165b184SJames Collins
17ab45ba71SJames Collinsrequire_once('icons/icons.php');
18c165b184SJames Collinsrequire_once('inc/simple_html_dom.php');
19c165b184SJames Collins
2010b40067Snomadjimbobclass Template
2110b40067Snomadjimbob{
229cff245bSJames Collins    /**
239cff245bSJames Collins     * @var string Template directory path from local FS.
249cff245bSJames Collins     */
25c165b184SJames Collins    public $tplDir  = '';
269cff245bSJames Collins
279cff245bSJames Collins    /**
289cff245bSJames Collins     * @var string Template directory path from web.
299cff245bSJames Collins     */
30c165b184SJames Collins    public $baseDir = '';
319cff245bSJames Collins
329cff245bSJames Collins    /**
339cff245bSJames Collins     * @var array Array of Javascript files to include in footer.
349cff245bSJames Collins     */
359cff245bSJames Collins    public $footerScript = [];
369cff245bSJames Collins
379cff245bSJames Collins    /**
389cff245bSJames Collins     * @var boolean Ignore LESS files.
399cff245bSJames Collins     */
40a8df40efSJames Collins    public $lessIgnored = false;
41c165b184SJames Collins
424f8225e4SJames Collins    /**
434f8225e4SJames Collins     * @var string Notifications from included pages.
444f8225e4SJames Collins     */
454f8225e4SJames Collins    private $includedPageNotifications = '';
464f8225e4SJames Collins
47c165b184SJames Collins
48c165b184SJames Collins    /**
49c165b184SJames Collins     * Class constructor
50c165b184SJames Collins     */
5110b40067Snomadjimbob    public function __construct()
5210b40067Snomadjimbob    {
53c165b184SJames Collins        $this->tplDir  = tpl_incdir();
54c165b184SJames Collins        $this->baseDir = tpl_basedir();
55c165b184SJames Collins
569cff245bSJames Collins        $this->registerHooks();
57c165b184SJames Collins    }
58c165b184SJames Collins
59c165b184SJames Collins    /**
60ab45ba71SJames Collins     * Returns the instance of the class
6147161538SJames Collins     *
62ab45ba71SJames Collins     * @return  Template        class instance
6347161538SJames Collins     */
6447161538SJames Collins    public static function getInstance()
6547161538SJames Collins    {
6647161538SJames Collins        static $instance = null;
6747161538SJames Collins
683a385f2cSJames Collins        if (empty($instance) === true) {
6947161538SJames Collins            $instance = new Template();
7047161538SJames Collins        }
7147161538SJames Collins
7247161538SJames Collins        return $instance;
7347161538SJames Collins    }
7447161538SJames Collins
75ab45ba71SJames Collins
7647161538SJames Collins    /**
77ab45ba71SJames Collins     * Register the themes hooks into Dokuwiki
789cff245bSJames Collins     *
799cff245bSJames Collins     * @return void
80c165b184SJames Collins     */
819cff245bSJames Collins    private function registerHooks()
8210b40067Snomadjimbob    {
83c165b184SJames Collins        global $EVENT_HANDLER;
84c165b184SJames Collins
859cff245bSJames Collins        $events_dispatcher = [
86ab45ba71SJames Collins            'TPL_METAHEADER_OUTPUT'     => 'metaheadersHandler'
879cff245bSJames Collins        ];
88c165b184SJames Collins
89c165b184SJames Collins        foreach ($events_dispatcher as $event => $method) {
90c165b184SJames Collins            $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method);
91c165b184SJames Collins        }
92c165b184SJames Collins    }
93c165b184SJames Collins
94c165b184SJames Collins
95c165b184SJames Collins    /**
96ab45ba71SJames Collins     * Meta handler hook for DokuWiki
97c165b184SJames Collins     *
989cff245bSJames Collins     * @param   \Doku_Event $event DokuWiki Event.
999cff245bSJames Collins     * @return  void
100c165b184SJames Collins     */
10110b40067Snomadjimbob    public function metaHeadersHandler(\Doku_Event $event)
10210b40067Snomadjimbob    {
103ab45ba71SJames Collins        global $MIKIO_ICONS;
104b5536b07SChris MacMackin        global $conf;
105ab45ba71SJames Collins
106ad182e6dSnomadjimbob        global $MIKIO_TEMPLATE;
107ad182e6dSnomadjimbob        $MIKIO_TEMPLATE = '123';
108ad182e6dSnomadjimbob
1099cff245bSJames Collins        $this->includePage('theme', false, true);
110a8eebd82SJames Collins
1119cff245bSJames Collins        $stylesheets    = [];
1129cff245bSJames Collins        $scripts        = [];
113c165b184SJames Collins
1143a385f2cSJames Collins        if (empty($this->getConf('customTheme')) === false) {
1159cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) {
116a8eebd82SJames Collins                $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less';
117a8eebd82SJames Collins            } else {
1189cff245bSJames Collins                if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) {
119ab45ba71SJames Collins                    $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css';
1202b4583abSJames Collins                }
121a8eebd82SJames Collins            }
1229cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) {
123ab45ba71SJames Collins                $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js';
124c165b184SJames Collins            }
125c165b184SJames Collins        }
126c165b184SJames Collins
1273a385f2cSJames Collins        if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) {
1289cff245bSJames Collins            $icons = [];
129ab45ba71SJames Collins            foreach ($MIKIO_ICONS as $icon) {
1309cff245bSJames Collins                if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) {
131ab45ba71SJames Collins                    $icons[] = $icon;
132c165b184SJames Collins
1333a385f2cSJames Collins                    if (empty($icon['css']) === false) {
1349cff245bSJames Collins                        if (strpos($icon['css'], '//') === false) {
135a8eebd82SJames Collins                            $stylesheets[] = $this->baseDir . 'icons/' . $icon['css'];
136ab45ba71SJames Collins                        } else {
137a8eebd82SJames Collins                            $stylesheets[] = $icon['css'];
138ab45ba71SJames Collins                        }
139ab45ba71SJames Collins                    }
140ab45ba71SJames Collins                }
141ab45ba71SJames Collins            }
142ab45ba71SJames Collins            $MIKIO_ICONS = $icons;
143ab45ba71SJames Collins        } else {
144ab45ba71SJames Collins            $MIKIO_ICONS = [];
145ab45ba71SJames Collins        }
146c165b184SJames Collins
1477864545bSChris MacMackin        $scripts[] = $this->baseDir . 'assets/mikio-typeahead.js';
148ab45ba71SJames Collins        $scripts[] = $this->baseDir . 'assets/mikio.js';
149644fd9f9SJames Collins
1509cff245bSJames Collins        if ($this->getConf('useLESS') === true) {
151ab45ba71SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.less';
152644fd9f9SJames Collins        } else {
153644fd9f9SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.css';
154644fd9f9SJames Collins        }
155644fd9f9SJames Collins
156ad182e6dSnomadjimbob        /* MikioPlugin Support */
1579ffe9161Snomadjimbob        if (plugin_load('action', 'mikioplugin') !== null) {
158ad182e6dSnomadjimbob            if ($this->getConf('useLESS') === true) {
159ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.less';
160ad182e6dSnomadjimbob            } else {
161ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.css';
162ad182e6dSnomadjimbob            }
163ad182e6dSnomadjimbob        }
164ab45ba71SJames Collins
165ab45ba71SJames Collins        $set = [];
166c165b184SJames Collins        foreach ($stylesheets as $style) {
1679cff245bSJames Collins            if (in_array($style, $set) === false) {
1683a385f2cSJames Collins                if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) {
169ab45ba71SJames Collins                    $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style);
170ab45ba71SJames Collins                }
171ab45ba71SJames Collins
1729cff245bSJames Collins                array_unshift($event->data['link'], [
173c165b184SJames Collins                    'type' => 'text/css',
174c165b184SJames Collins                    'rel'  => 'stylesheet',
175c165b184SJames Collins                    'href' => $style
1769cff245bSJames Collins                ]);
177c165b184SJames Collins            }
178ab45ba71SJames Collins            $set[] = $style;
179ab45ba71SJames Collins        }
180c165b184SJames Collins
181ab45ba71SJames Collins        $set = [];
182c165b184SJames Collins        foreach ($scripts as $script) {
1839cff245bSJames Collins            if (in_array($script, $set) === false) {
1849cff245bSJames Collins                $script_params = [
185c165b184SJames Collins                    'type'  => 'text/javascript',
186c165b184SJames Collins                    '_data' => '',
1878395cdcbSChris MacMackin                    'src'   => $script
1889cff245bSJames Collins                ];
189c1ecb866SJames Collins
190c1ecb866SJames Collins                // equal to or greator than hogfather
191c1ecb866SJames Collins                if ($this->dwVersionNumber() >= 20200729) {
192c1ecb866SJames Collins                    // greator than hogfather - defer always on
193c1ecb866SJames Collins                    if ($this->dwVersionNumber() >= 20200729) {
194c1ecb866SJames Collins                        $script_params += ['defer' => 'defer'];
195c1ecb866SJames Collins                    } else {
196c1ecb866SJames Collins                        // hogfather - defer always on unless $conf['defer_js'] is false
1979cff245bSJames Collins                        if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) {
1988395cdcbSChris MacMackin                            $script_params += ['defer' => 'defer'];
1998395cdcbSChris MacMackin                        }
200c1ecb866SJames Collins                    }
201c1ecb866SJames Collins                }
202c1ecb866SJames Collins
2038395cdcbSChris MacMackin                $event->data['script'][] = $script_params;
2049cff245bSJames Collins            }//end if
205ab45ba71SJames Collins            $set[] = $script;
2069cff245bSJames Collins        }//end foreach
207c165b184SJames Collins    }
208c165b184SJames Collins
209c165b184SJames Collins
210c165b184SJames Collins    /**
211a8eebd82SJames Collins     * Print or return the footer meta data
212c165b184SJames Collins     *
2139cff245bSJames Collins     * @param   boolean $print Print the data to buffer.
2149cff245bSJames Collins     * @return  string         HTML footer meta data
215c165b184SJames Collins     */
2169cff245bSJames Collins    public function includeFooterMeta(bool $print = true)
21710b40067Snomadjimbob    {
218a8eebd82SJames Collins        $html = '';
219a8eebd82SJames Collins
220a8eebd82SJames Collins        if (count($this->footerScript) > 0) {
221a8eebd82SJames Collins            $html .= '<script type="text/javascript">function mikioFooterRun() {';
222a8eebd82SJames Collins            foreach ($this->footerScript as $script) {
223a8eebd82SJames Collins                $html .= $script . ';';
224a8eebd82SJames Collins            }
225a8eebd82SJames Collins            $html .= '}</script>';
226a8eebd82SJames Collins        }
227c165b184SJames Collins
228c165b184SJames Collins
2299cff245bSJames Collins        if ($print === true) {
2309cff245bSJames Collins            echo $html;
2319cff245bSJames Collins        }
232a8eebd82SJames Collins        return $html;
233a8eebd82SJames Collins    }
234a8eebd82SJames Collins
23595372bffSJames Collins
23695372bffSJames Collins    // phpcs:disable Squiz.Commenting.FunctionComment.TypeHintMissing
23795372bffSJames Collins
23895372bffSJames Collins
239a8eebd82SJames Collins    /**
240ab45ba71SJames Collins     * Retreive and parse theme configuration options
241c165b184SJames Collins     *
2429cff245bSJames Collins     * @param   string $key     The configuration key to retreive.
2439cff245bSJames Collins     * @param   mixed  $default If key doesn't exist, return this value.
244ab45ba71SJames Collins     * @return  mixed           parsed value of configuration
245c165b184SJames Collins     */
24695372bffSJames Collins    public function getConf(string $key, $default = false)
24710b40067Snomadjimbob    {
248c165b184SJames Collins        $value = tpl_getConf($key, $default);
249c165b184SJames Collins
2503a385f2cSJames Collins        $data = [
2513a385f2cSJames Collins            ['keys' => ['navbarDWMenuType'],                'type' => 'choice',
2523a385f2cSJames Collins                'values' => ['both', 'icons', 'text']
2533a385f2cSJames Collins            ],
2543a385f2cSJames Collins            ['keys' => ['navbarDWMenuCombine'],             'type' => 'choice',
2553a385f2cSJames Collins                'values' => ['combine', 'seperate', 'dropdown']
2563a385f2cSJames Collins            ],
2573a385f2cSJames Collins            ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'],
2583a385f2cSJames Collins                'type' => 'choice',
2593a385f2cSJames Collins                'values' => ['none', 'custom', 'search', 'dokuwiki'],
2603a385f2cSJames Collins                'default' => [
2613a385f2cSJames Collins                    'navbarPosLeft' => 'none',
2623a385f2cSJames Collins                    'navbarPosMiddle' => 'search',
2633a385f2cSJames Collins                    'navbarPosRight' => 'dokuwiki'
2643a385f2cSJames Collins                ]
2653a385f2cSJames Collins            ],
2663a385f2cSJames Collins            ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink',
2673a385f2cSJames Collins                'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile',
2683a385f2cSJames Collins                'navbarItemShowAdmin'
2693a385f2cSJames Collins            ],
2703a385f2cSJames Collins                'type' => 'choice',
2713a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
2723a385f2cSJames Collins            ],
2733a385f2cSJames Collins            ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'],
2743a385f2cSJames Collins                'type' => 'choice',
2753a385f2cSJames Collins                'values' => ['always', 'never']
2763a385f2cSJames Collins            ],
2773a385f2cSJames Collins            ['keys' => ['searchButton'],                    'type' => 'choice',
2783a385f2cSJames Collins                'values' => ['icon', 'text']
2793a385f2cSJames Collins            ],
2803a385f2cSJames Collins            ['keys' => ['breadcrumbPosition', 'youareherePosition'],
2813a385f2cSJames Collins                'type' => 'choice',
2823a385f2cSJames Collins                'values' => ['top', 'hero', 'page', 'none']
2833a385f2cSJames Collins            ],
2843a385f2cSJames Collins            ['keys' => ['youarehereHome'],                  'type' => 'choice',
2853a385f2cSJames Collins                'values' => ['page title', 'home', 'icon', 'none']
2863a385f2cSJames Collins            ],
2873a385f2cSJames Collins            ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'],
2883a385f2cSJames Collins                'type' => 'choice',
2893a385f2cSJames Collins                'values' => ['none', 'logged in user', 'search', 'content', 'tags'],
2903a385f2cSJames Collins                'default' => [
2913a385f2cSJames Collins                    'sidebarLeftRow1' => 'logged in user',
2923a385f2cSJames Collins                    'sidebarLeftRow2' => 'search',
2933a385f2cSJames Collins                    'sidebarLeftRow3' => 'content'
2943a385f2cSJames Collins                ]
2953a385f2cSJames Collins            ],
2963a385f2cSJames Collins            ['keys' => ['pageToolsFloating', 'pageToolsFooter'],
2973a385f2cSJames Collins                'type' => 'choice',
2983a385f2cSJames Collins                'values' => ['always', 'none', 'page editors']
2993a385f2cSJames Collins            ],
3003a385f2cSJames Collins            ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink',
3013a385f2cSJames Collins                'pageToolsShowTop'
3023a385f2cSJames Collins            ],
3033a385f2cSJames Collins                'type' => 'choice',
3043a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
3053a385f2cSJames Collins            ],
3063a385f2cSJames Collins            ['keys' => ['showNotifications'],               'type' => 'choice',
3073a385f2cSJames Collins                'values' => ['admin', 'always', 'none']
3083a385f2cSJames Collins            ],
3093a385f2cSJames Collins            ['keys' => ['licenseType'],                     'type' => 'choice',
3103a385f2cSJames Collins                'values' => ['badge', 'button', 'none']
3113a385f2cSJames Collins            ],
3123a385f2cSJames Collins            ['keys' => ['navbarUseTitleIcon'],              'type' => 'bool'],
3133a385f2cSJames Collins            ['keys' => ['navbarUseTitleText'],              'type' => 'bool'],
3143a385f2cSJames Collins            ['keys' => ['navbarUseTaglineText'],            'type' => 'bool'],
3153a385f2cSJames Collins            ['keys' => ['navbarShowSub'],                   'type' => 'bool'],
3163a385f2cSJames Collins            ['keys' => ['heroTitle'],                       'type' => 'bool'],
3173a385f2cSJames Collins            ['keys' => ['heroImagePropagation'],            'type' => 'bool'],
3183a385f2cSJames Collins            ['keys' => ['breadcrumbPrefix'],                'type' => 'bool'],
3193a385f2cSJames Collins            ['keys' => ['breadcrumbSep'],                   'type' => 'bool'],
3203a385f2cSJames Collins            ['keys' => ['youareherePrefix'],                'type' => 'bool'],
3213a385f2cSJames Collins            ['keys' => ['youarehereSep'],                   'type' => 'bool'],
3223a385f2cSJames Collins            ['keys' => ['sidebarShowLeft'],                 'type' => 'bool'],
3233a385f2cSJames Collins            ['keys' => ['sidebarShowRight'],                'type' => 'bool'],
3243a385f2cSJames Collins            ['keys' => ['tocFull'],                         'type' => 'bool'],
3253a385f2cSJames Collins            ['keys' => ['footerSearch'],                    'type' => 'bool'],
3263a385f2cSJames Collins            ['keys' => ['licenseImageOnly'],                'type' => 'bool'],
3273a385f2cSJames Collins            ['keys' => ['includePageUseACL'],               'type' => 'bool'],
3283a385f2cSJames Collins            ['keys' => ['includePagePropagate'],            'type' => 'bool'],
3293a385f2cSJames Collins            ['keys' => ['youarehereHideHome'],              'type' => 'bool'],
3303a385f2cSJames Collins            ['keys' => ['tagsConsolidate'],                 'type' => 'bool'],
3313a385f2cSJames Collins            ['keys' => ['footerInPage'],                    'type' => 'bool'],
3323a385f2cSJames Collins            ['keys' => ['sidebarMobileDefaultCollapse'],    'type' => 'bool'],
3333a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowLeft'],           'type' => 'bool'],
3343a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowRight'],          'type' => 'bool'],
3353a385f2cSJames Collins            ['keys' => ['searchUseTypeahead'],              'type' => 'bool'],
33612030b10SJames Collins            ['keys' => ['showLightDark'],                   'type' => 'bool'],
33734d5f19aSJames Collins            ['keys' => ['autoLightDark'],                   'type' => 'bool'],
3383a385f2cSJames Collins            ['keys' => ['youarehereShowLast'],              'type' => 'int'],
3393a385f2cSJames Collins
3403a385f2cSJames Collins            ['keys' => ['iconTag'],                         'type' => 'string'],
3413a385f2cSJames Collins            ['keys' => ['customTheme'],                     'type' => 'string'],
3423a385f2cSJames Collins            ['keys' => ['navbarCustomMenuText'],            'type' => 'string'],
3433a385f2cSJames Collins            ['keys' => ['breadcrumbPrefixText'],            'type' => 'string'],
3443a385f2cSJames Collins            ['keys' => ['breadcrumbSepText'],               'type' => 'string'],
3453a385f2cSJames Collins            ['keys' => ['youareherePrefixText'],            'type' => 'string'],
3463a385f2cSJames Collins            ['keys' => ['youarehereSepText'],               'type' => 'string'],
3473a385f2cSJames Collins            ['keys' => ['footerCustomMenuText'],            'type' => 'string'],
3483a385f2cSJames Collins            ['keys' => ['brandURLGuest'],                   'type' => 'string'],
3493a385f2cSJames Collins            ['keys' => ['brandURLUser'],                    'type' => 'string'],
3503a385f2cSJames Collins
3513a385f2cSJames Collins            ['keys' => ['useLESS'],                         'type' => 'less'],
3523a385f2cSJames Collins        ];
3533a385f2cSJames Collins
3543a385f2cSJames Collins        foreach ($data as $row) {
3553a385f2cSJames Collins            // does not check case....
3563a385f2cSJames Collins            if (in_array($key, $row['keys']) === true) {
35795372bffSJames Collins                if (array_key_exists('type', $row) === true) {
3583a385f2cSJames Collins                    switch ($row['type']) {
3593a385f2cSJames Collins                        case 'bool':
3603a385f2cSJames Collins                            return (bool) $value;
3613a385f2cSJames Collins                        case 'int':
3623a385f2cSJames Collins                            return (int) $value;
3633a385f2cSJames Collins                        case 'string':
3643a385f2cSJames Collins                            return $value;
3653a385f2cSJames Collins                        case 'less':
36629118ed7SJames Collins                            $value = (bool) $value;
367a8df40efSJames Collins                            $lessAvailable = true;
368a8df40efSJames Collins
369a8df40efSJames Collins                            // check for less library
370a8df40efSJames Collins                            $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php';
3719cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
372a8df40efSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3739cff245bSJames Collins                            }
3749cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
375a8df40efSJames Collins                                $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3769cff245bSJames Collins                            }
3779cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
3789cff245bSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] .
3799cff245bSJames Collins                                    '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3809cff245bSJames Collins                            }
3819cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
382a8df40efSJames Collins                                $lessAvailable = false;
383a8df40efSJames Collins                            }
384a8df40efSJames Collins
385a8df40efSJames Collins                            // check for ctype extensions
3869cff245bSJames Collins                            if (function_exists('ctype_digit') === false) {
387a8df40efSJames Collins                                $lessAvailable = false;
388a8df40efSJames Collins                            }
389a8df40efSJames Collins
3909cff245bSJames Collins                            if ($value === true && $lessAvailable === false) {
391a8df40efSJames Collins                                $this->lessIgnored = true;
39229118ed7SJames Collins                                $value = false;
39329118ed7SJames Collins                            }
3943a385f2cSJames Collins
3953a385f2cSJames Collins                            return $value;
3969cff245bSJames Collins                    }//end switch
3973a385f2cSJames Collins                }//end if
3983a385f2cSJames Collins
3993a385f2cSJames Collins                if (in_array($value, $row['values']) === true) {
4003a385f2cSJames Collins                    return $value;
4013a385f2cSJames Collins                }
4023a385f2cSJames Collins
4033a385f2cSJames Collins                if (array_key_exists('default', $row) === true) {
4043a385f2cSJames Collins                    if (is_array($row['default']) === true) {
4053a385f2cSJames Collins                        if (array_key_exists($key, $row['default']) === true) {
4063a385f2cSJames Collins                            return $row['default'][$key];
4073a385f2cSJames Collins                        }
4083a385f2cSJames Collins                    } else {
4093a385f2cSJames Collins                        return $row['default'];
4103a385f2cSJames Collins                    }
4113a385f2cSJames Collins                }
4123a385f2cSJames Collins
4133a385f2cSJames Collins                return reset($row['values']);
4143a385f2cSJames Collins            }//end if
4153a385f2cSJames Collins        }//end foreach
416c165b184SJames Collins
417c165b184SJames Collins        return $value;
418c165b184SJames Collins    }
419c165b184SJames Collins
420c165b184SJames Collins
42195372bffSJames Collins    // phpcs:enable
42295372bffSJames Collins
42395372bffSJames Collins
424c165b184SJames Collins    /**
425a8eebd82SJames Collins     * Check if a page exist in directory or namespace
426c165b184SJames Collins     *
4279cff245bSJames Collins     * @param   string $page Page/namespace to search.
428a8eebd82SJames Collins     * @return  boolean      if page exists
429c165b184SJames Collins     */
4309cff245bSJames Collins    public function pageExists(string $page)
43110b40067Snomadjimbob    {
432ab45ba71SJames Collins        ob_start();
433a8eebd82SJames Collins        tpl_includeFile($page . '.html');
434ab45ba71SJames Collins        $html = ob_get_contents();
435ab45ba71SJames Collins        ob_end_clean();
436a8eebd82SJames Collins
4373a385f2cSJames Collins        if (empty($html) === false) {
4389cff245bSJames Collins            return true;
4399cff245bSJames Collins        }
440a8eebd82SJames Collins
441a8eebd82SJames Collins        $useACL = $this->getConf('includePageUseACL');
442a8eebd82SJames Collins        $propagate = $this->getConf('includePagePropagate');
443a8eebd82SJames Collins
4449cff245bSJames Collins        if ($propagate === true) {
4459cff245bSJames Collins            if (page_findnearest($page, $useACL) !== false) {
4469cff245bSJames Collins                return true;
4479cff245bSJames Collins            }
4489cff245bSJames Collins        } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) {
4499cff245bSJames Collins            return true;
450ab45ba71SJames Collins        }
451ab45ba71SJames Collins
4529cff245bSJames Collins        return false;
453ab45ba71SJames Collins    }
454ab45ba71SJames Collins
455a8eebd82SJames Collins
456c165b184SJames Collins    /**
457a8eebd82SJames Collins     * Print or return page from directory or namespace
4582b4583abSJames Collins     *
4599cff245bSJames Collins     * @param   string  $page         Page/namespace to include.
4609cff245bSJames Collins     * @param   boolean $print        Print content.
4619cff245bSJames Collins     * @param   boolean $parse        Parse content before printing/returning.
4629cff245bSJames Collins     * @param   string  $classWrapper Wrap page in a div with class.
463ab45ba71SJames Collins     * @return  string                contents of page found
4642b4583abSJames Collins     */
4659cff245bSJames Collins    public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '')
4662b4583abSJames Collins    {
467a8eebd82SJames Collins        ob_start();
468a8eebd82SJames Collins        tpl_includeFile($page . '.html');
469a8eebd82SJames Collins        $html = ob_get_contents();
470a8eebd82SJames Collins        ob_end_clean();
471a8eebd82SJames Collins
4723a385f2cSJames Collins        if (empty($html) === true) {
4734f8225e4SJames Collins            global $MSG;
4744f8225e4SJames Collins
475a8eebd82SJames Collins            $useACL = $this->getConf('includePageUseACL');
476a8eebd82SJames Collins            $propagate = $this->getConf('includePagePropagate');
477ab45ba71SJames Collins            $html = '';
4782b4583abSJames Collins
4794f8225e4SJames Collins            ob_start();
480ab45ba71SJames Collins            $html = tpl_include_page($page, false, $propagate, $useACL);
4814f8225e4SJames Collins            $this->includedPageNotifications .= ob_get_contents();
4824f8225e4SJames Collins            ob_end_clean();
483ab45ba71SJames Collins        }
4842b4583abSJames Collins
4853a385f2cSJames Collins        if (empty($html) === false && $parse === true) {
486ab45ba71SJames Collins            $html = $this->parseContent($html);
487ab45ba71SJames Collins        }
4882b4583abSJames Collins
4893a385f2cSJames Collins        if (empty($classWrapper) === false && empty($html) === false) {
4909cff245bSJames Collins            $html = '<div class="' . $classWrapper . '">' . $html . '</div>';
4919cff245bSJames Collins        }
4922b4583abSJames Collins
4939cff245bSJames Collins        if ($print === true) {
4949cff245bSJames Collins            echo $html;
4959cff245bSJames Collins        }
496ab45ba71SJames Collins        return $html;
4972b4583abSJames Collins    }
4982b4583abSJames Collins
499a8eebd82SJames Collins
500a8eebd82SJames Collins    /**
501a8eebd82SJames Collins     * Print or return logged in user information
502a8eebd82SJames Collins     *
5039cff245bSJames Collins     * @param   boolean $print Print content.
504a8eebd82SJames Collins     * @return  string         user information
505a8eebd82SJames Collins     */
5069cff245bSJames Collins    public function includeLoggedIn(bool $print = true)
50710b40067Snomadjimbob    {
508a8eebd82SJames Collins        $html = '';
509a8eebd82SJames Collins
5109cff245bSJames Collins        if (empty($_SERVER['REMOTE_USER']) === false) {
511a8eebd82SJames Collins            $html .= '<div class="mikio-user-info">';
512a8eebd82SJames Collins            ob_start();
513a8eebd82SJames Collins            tpl_userinfo();
514a8eebd82SJames Collins            $html .= ob_get_contents();
515a8eebd82SJames Collins            ob_end_clean();
516a8eebd82SJames Collins            $html .= '</div>';
5172b4583abSJames Collins        }
518a8eebd82SJames Collins
5199cff245bSJames Collins        if ($print === true) {
5209cff245bSJames Collins            echo $html;
5219cff245bSJames Collins        }
522a8eebd82SJames Collins        return $html;
5232b4583abSJames Collins    }
5242b4583abSJames Collins
5252b4583abSJames Collins
526a8eebd82SJames Collins    /**
527a8eebd82SJames Collins     * Print or return DokuWiki Menu
528a8eebd82SJames Collins     *
5299cff245bSJames Collins     * @param   boolean $print Print content.
530a8eebd82SJames Collins     * @return  string         contents of the menu
531a8eebd82SJames Collins     */
5329cff245bSJames Collins    public function includeDWMenu(bool $print = true)
53310b40067Snomadjimbob    {
5342b4583abSJames Collins        global $lang;
5352b4583abSJames Collins        global $USERINFO;
536c165b184SJames Collins
5379cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
538a8eebd82SJames Collins        $html = '<ul class="mikio-nav">';
5392b4583abSJames Collins
540ab45ba71SJames Collins        $pageToolsMenu = [];
541ab45ba71SJames Collins        $siteToolsMenu = [];
542ab45ba71SJames Collins        $userToolsMenu = [];
543c165b184SJames Collins
544ab45ba71SJames Collins        $showIcons  = ($this->getConf('navbarDWMenuType') != 'text');
545ab45ba71SJames Collins        $showText   = ($this->getConf('navbarDWMenuType') != 'icons');
546ab45ba71SJames Collins        $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate');
5472b4583abSJames Collins
5482b4583abSJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
5492b4583abSJames Collins        foreach ($items as $item) {
5509cff245bSJames Collins            if ($item->getType() !== 'top') {
551ab45ba71SJames Collins                $itemHtml = '';
5522b4583abSJames Collins
553905b27c6SJames Collins                $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5549cff245bSJames Collins                if (
5553a385f2cSJames Collins                    $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5563a385f2cSJames Collins                    (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5573a385f2cSJames Collins                    (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5589cff245bSJames Collins                ) {
5599cff245bSJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') .
5609cff245bSJames Collins                        ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5619cff245bSJames Collins                    if ($showIcons === true) {
5629cff245bSJames Collins                        $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5639cff245bSJames Collins                    }
5649cff245bSJames Collins                    if ($showText === true || $isDropDown === true) {
5659cff245bSJames Collins                        $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5669cff245bSJames Collins                    }
567ab45ba71SJames Collins                    $itemHtml .= '</a>';
568ab45ba71SJames Collins
569ab45ba71SJames Collins                    $pageToolsMenu[] = $itemHtml;
5702b4583abSJames Collins                }
5719cff245bSJames Collins            }//end if
5729cff245bSJames Collins        }//end foreach
5732b4583abSJames Collins
574ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action');
575ab45ba71SJames Collins        foreach ($items as $item) {
576ab45ba71SJames Collins            $itemHtml = '';
5772b4583abSJames Collins
578905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5799cff245bSJames Collins            if (
5803a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5813a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5823a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5839cff245bSJames Collins            ) {
5849cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' .
5859cff245bSJames Collins                    $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5869cff245bSJames Collins                if ($showIcons === true) {
5879cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5889cff245bSJames Collins                }
5899cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
5909cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5919cff245bSJames Collins                }
592ab45ba71SJames Collins                $itemHtml .= '</a>';
5932b4583abSJames Collins
594ab45ba71SJames Collins                $siteToolsMenu[] = $itemHtml;
5952b4583abSJames Collins            }
5969cff245bSJames Collins        }//end foreach
5972b4583abSJames Collins
598ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\UserMenu())->getItems('action');
599ab45ba71SJames Collins        foreach ($items as $item) {
600ab45ba71SJames Collins            $itemHtml = '';
601ab45ba71SJames Collins
602905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
6039cff245bSJames Collins            if (
6043a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
6053a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
6063a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
6079cff245bSJames Collins            ) {
6089cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' .
6099cff245bSJames Collins                $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
6109cff245bSJames Collins                if ($showIcons === true) {
6119cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
6129cff245bSJames Collins                }
6139cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
6149cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
6159cff245bSJames Collins                }
616ab45ba71SJames Collins                $itemHtml .= '</a>';
617ab45ba71SJames Collins
618ab45ba71SJames Collins                $userToolsMenu[] = $itemHtml;
619ab45ba71SJames Collins            }
6209cff245bSJames Collins        }//end foreach
621ab45ba71SJames Collins
622ab45ba71SJames Collins
623ab45ba71SJames Collins        switch ($this->getConf('navbarDWMenuCombine')) {
624ab45ba71SJames Collins            case 'dropdown':
625ab45ba71SJames Collins                $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">';
6269cff245bSJames Collins                $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button"
6279cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6289cff245bSJames Collins                ($showIcons === true ? $this->mikioInlineIcon('file') : '') .
6299cff245bSJames Collins                ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] .
6309cff245bSJames Collins                '</span>') . '</a>';
631a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
632ab45ba71SJames Collins
633ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
634ab45ba71SJames Collins                    $html .= $item;
635ab45ba71SJames Collins                }
636ab45ba71SJames Collins
637ab45ba71SJames Collins                $html .= '</div>';
638ab45ba71SJames Collins                $html .= '</li>';
639ab45ba71SJames Collins
640a8eebd82SJames Collins                $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">';
6419cff245bSJames Collins                $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button"
6429cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6439cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('gear') : '') .
6449cff245bSJames Collins                    ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' .
6459cff245bSJames Collins                    $lang['site_tools'] . '</span>') . '</a>';
646a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
647ab45ba71SJames Collins
648ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
649ab45ba71SJames Collins                    $html .= $item;
650ab45ba71SJames Collins                }
651ab45ba71SJames Collins
652ab45ba71SJames Collins                $html .= '</div>';
653ab45ba71SJames Collins                $html .= '</li>';
654ab45ba71SJames Collins
655a8eebd82SJames Collins                $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">';
6569cff245bSJames Collins                $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button"
6579cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6589cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('user') : '') .
6599cff245bSJames Collins                    ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' .
6609cff245bSJames Collins                    $lang['user_tools'] . '</span>') . '</a>';
661a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
662ab45ba71SJames Collins
663ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
664ab45ba71SJames Collins                    $html .= $item;
665ab45ba71SJames Collins                }
666ab45ba71SJames Collins
667ab45ba71SJames Collins                $html .= '</div>';
668ab45ba71SJames Collins                $html .= '</li>';
669ab45ba71SJames Collins
670ab45ba71SJames Collins                break;
671ab45ba71SJames Collins
672ab45ba71SJames Collins            case 'combine':
673ab45ba71SJames Collins                $html .= '<li class="mikio-nav-dropdown">';
6749cff245bSJames Collins                $html .= '<a class="mikio-nav-link" href="#">' .
6759cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') .
6769cff245bSJames Collins                    ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' .
6779cff245bSJames Collins                    tpl_getLang('tools-menu') . '</span>') . '</a>';
678a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
679ab45ba71SJames Collins
680ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>';
681ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
682ab45ba71SJames Collins                    $html .= $item;
683ab45ba71SJames Collins                }
684ab45ba71SJames Collins
685ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
686ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>';
687ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
688ab45ba71SJames Collins                    $html .= $item;
689ab45ba71SJames Collins                }
690ab45ba71SJames Collins
691ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
692ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>';
693ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
694ab45ba71SJames Collins                    $html .= $item;
695ab45ba71SJames Collins                }
696ab45ba71SJames Collins
697ab45ba71SJames Collins                $html .= '</div>';
698ab45ba71SJames Collins                $html .= '</li>';
699ab45ba71SJames Collins                break;
700ab45ba71SJames Collins
701ab45ba71SJames Collins            default:    // seperate
702ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
703a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
704ab45ba71SJames Collins                }
705ab45ba71SJames Collins
706ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
707a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
708a8eebd82SJames Collins                }
709a8eebd82SJames Collins
710a8eebd82SJames Collins                foreach ($userToolsMenu as $item) {
711a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
712ab45ba71SJames Collins                }
713ab45ba71SJames Collins
714ab45ba71SJames Collins                break;
7159cff245bSJames Collins        }//end switch
716ab45ba71SJames Collins
7173a3ece10SJames Collins        $translation = plugin_load('helper', 'translation');
7183a3ece10SJames Collins        if ($translation !== null) {
7193a3ece10SJames Collins            $html .= '<li id="mikio__translate" class="mikio-nav-dropdown">';
7203a3ece10SJames Collins            $html .= '<a id="mikio_dropdown_translate" class="nav-link dropdown-toggle" href="#" role="button"
7213a3ece10SJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
7223a3ece10SJames Collins                $this->mikioInlineIcon('language') .
7233a3ece10SJames Collins                 '</a>';
7243a3ece10SJames Collins            $html .= '<div class="mikio-dropdown closed">';
7253a3ece10SJames Collins
7263a3ece10SJames Collins                $html .= $translation->showTranslations();
7273a3ece10SJames Collins
7283a3ece10SJames Collins            $html .= '</div>';
7293a3ece10SJames Collins            $html .= '</li>';
7303a3ece10SJames Collins        }
7313a3ece10SJames Collins
73212030b10SJames Collins        if ($this->getConf('showLightDark') === true) {
733d0fba6d1SJames Collins            $autoLightDark = $this->getConf('autoLightDark');
7349e41d878SJames Collins            $html .= '<li class="mikio-darklight">
7359e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' .
736d0fba6d1SJames Collins            ($autoLightDark === true ? $this->mikioInlineIcon('sunmoon', 'mikio-darklight-auto') : '') .
7379e41d878SJames Collins            $this->mikioInlineIcon('sun', 'mikio-darklight-light') .
7389e41d878SJames Collins            $this->mikioInlineIcon('moon', 'mikio-darklight-dark') .
7399e41d878SJames Collins            '</a></li>';
74012030b10SJames Collins        }
74112030b10SJames Collins
742ab45ba71SJames Collins        $html .= '</ul>';
743ab45ba71SJames Collins
7449cff245bSJames Collins        if ($print === true) {
7459cff245bSJames Collins            echo $html;
7469cff245bSJames Collins        }
747a8eebd82SJames Collins        return $html;
748a8eebd82SJames Collins    }
749a8eebd82SJames Collins
750a8eebd82SJames Collins
751a8eebd82SJames Collins    /**
752a8eebd82SJames Collins     * Create a nav element from a string. <uri>|<title>;
753a8eebd82SJames Collins     *
7549cff245bSJames Collins     * @param string $str String to generate nav.
755a8eebd82SJames Collins     * @return string     nav elements generated
756a8eebd82SJames Collins     */
7579cff245bSJames Collins    public function stringToNav(string $str)
75810b40067Snomadjimbob    {
759a8eebd82SJames Collins        $html = '';
760a8eebd82SJames Collins
7613a385f2cSJames Collins        if (empty($str) === false) {
762a8eebd82SJames Collins            $items = explode(';', $str);
763a8eebd82SJames Collins            if (count($items) > 0) {
764a8eebd82SJames Collins                $html .= '<ul class="mikio-nav">';
765a8eebd82SJames Collins                foreach ($items as $item) {
766a8eebd82SJames Collins                    $parts = explode('|', $item);
767a8eebd82SJames Collins                    if ($parts > 1) {
7689cff245bSJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' .
7699cff245bSJames Collins                            strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) .
7709cff245bSJames Collins                            '</a></li>';
771a8eebd82SJames Collins                    }
772a8eebd82SJames Collins                }
773a8eebd82SJames Collins                $html .= '</ul>';
774a8eebd82SJames Collins            }
7752b4583abSJames Collins        }
7762b4583abSJames Collins
777ab45ba71SJames Collins        return $html;
7782b4583abSJames Collins    }
7792b4583abSJames Collins
780a8eebd82SJames Collins    /**
781ab45ba71SJames Collins     * print or return the main navbar
7822b4583abSJames Collins     *
7839cff245bSJames Collins     * @param boolean $print   Print the navbar.
7849cff245bSJames Collins     * @param boolean $showSub Include the sub navbar.
785ab45ba71SJames Collins     * @return string          generated content
7862b4583abSJames Collins     */
7879cff245bSJames Collins    public function includeNavbar(bool $print = true, bool $showSub = false)
78810b40067Snomadjimbob    {
789b39ad16dSJames Collins        global $conf, $USERINFO;
790d3d7d2b7SJames Collins
791d3d7d2b7SJames Collins        $homeUrl = wl();
792d3d7d2b7SJames Collins
7939cff245bSJames Collins        if (plugin_isdisabled('showpageafterlogin') === false) {
794d3d7d2b7SJames Collins            $p = &plugin_load('action', 'showpageafterlogin');
7953a385f2cSJames Collins            if (empty($p) === false) {
7969cff245bSJames Collins                if (is_array($USERINFO) === true && count($USERINFO) > 0) {
797d3d7d2b7SJames Collins                    $homeUrl = wl($p->getConf('page_after_login'));
798d3d7d2b7SJames Collins                }
799d3d7d2b7SJames Collins            }
800b39ad16dSJames Collins        } else {
8019cff245bSJames Collins            if (is_array($USERINFO) === true && count($USERINFO) > 0) {
802b39ad16dSJames Collins                $url = $this->getConf('brandURLUser');
803b39ad16dSJames Collins                if (strlen($url) > 0) {
804b39ad16dSJames Collins                    $homeUrl = $url;
805d3d7d2b7SJames Collins                }
806b39ad16dSJames Collins            } else {
807b39ad16dSJames Collins                $url = $this->getConf('brandURLGuest');
808b39ad16dSJames Collins                if (strlen($url) > 0) {
809b39ad16dSJames Collins                    $homeUrl = $url;
810b39ad16dSJames Collins                }
811b39ad16dSJames Collins            }
812b39ad16dSJames Collins        }
813d3d7d2b7SJames Collins
814ab45ba71SJames Collins        $html = '';
81547161538SJames Collins
8169cff245bSJames Collins        $html .= '<nav class="mikio-navbar'  . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') .
8179cff245bSJames Collins            '">';
818f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
819d3d7d2b7SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">';
8209cff245bSJames Collins        if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) {
821ab45ba71SJames Collins            // Brand image
8229cff245bSJames Collins            if ($this->getConf('navbarUseTitleIcon') === true) {
8239cff245bSJames Collins                $logo = $this->getMediaFile('logo', false);
8249cff245bSJames Collins                ;
8253a385f2cSJames Collins                if (empty($logo) === false) {
826f0241fc4SJames Collins                    $width = $this->getConf('navbarTitleIconWidth');
827f0241fc4SJames Collins                    $height = $this->getConf('navbarTitleIconHeight');
828f0241fc4SJames Collins                    $styles = '';
829f0241fc4SJames Collins
830f0241fc4SJames Collins                    if (strlen($width) > 0 || strlen($height) > 0) {
8319cff245bSJames Collins                        if (ctype_digit($width) === true) {
832f0241fc4SJames Collins                            $styles .= 'max-width:' . intval($width) . 'px;';
8339cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) {
834f0241fc4SJames Collins                            $styles .= 'max-width:' . $width . ';';
8359cff245bSJames Collins                        } elseif (strcasecmp($width, 'none') === 0) {
8367a92c19bSJames Collins                            $styles .= 'max-width:none;';
837f0241fc4SJames Collins                        }
838f0241fc4SJames Collins
8399cff245bSJames Collins                        if (ctype_digit($height) === true) {
840f0241fc4SJames Collins                            $styles .= 'max-height:' . intval($height) . 'px;';
8419cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) {
842f0241fc4SJames Collins                            $styles .= 'max-height:' . $height . ';';
8439cff245bSJames Collins                        } elseif (strcasecmp($height, 'none') === 0) {
8447a92c19bSJames Collins                            $styles .= 'max-height:none;';
845f0241fc4SJames Collins                        }
846f0241fc4SJames Collins
847f0241fc4SJames Collins                        if (strlen($styles) > 0) {
848f0241fc4SJames Collins                            $styles = ' style="' . $styles . '"';
849f0241fc4SJames Collins                        }
8509cff245bSJames Collins                    }//end if
851f0241fc4SJames Collins
852f0241fc4SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>';
8539cff245bSJames Collins                }//end if
8549cff245bSJames Collins            }//end if
855ab45ba71SJames Collins
856ab45ba71SJames Collins            // Brand title
8579cff245bSJames Collins            if ($this->getConf('navbarUseTitleText') === true) {
858ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
859a8eebd82SJames Collins                $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>';
8609cff245bSJames Collins                if ($this->getConf('navbarUseTaglineText') === true) {
861a8eebd82SJames Collins                    $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>';
862ab45ba71SJames Collins                }
863ab45ba71SJames Collins                $html .= '</div>';
864ab45ba71SJames Collins            }
8659cff245bSJames Collins        }//end if
866ab45ba71SJames Collins        $html .= '</a>';
867660b2c71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>';
868ab45ba71SJames Collins
869ab45ba71SJames Collins        // Menus
870ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
871ab45ba71SJames Collins
8729cff245bSJames Collins        $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'),
8739cff245bSJames Collins            $this->getConf('navbarPosRight', 'none')
8749cff245bSJames Collins        ];
875a8eebd82SJames Collins        foreach ($menus as $menuType) {
876a8eebd82SJames Collins            switch ($menuType) {
877a8eebd82SJames Collins                case 'custom':
878a8eebd82SJames Collins                    $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', ''));
879a8eebd82SJames Collins                    break;
880a8eebd82SJames Collins                case 'search':
881ab45ba71SJames Collins                    $html .= '<div class="mikio-nav-item">';
882ab45ba71SJames Collins                    $html .= $this->includeSearch(false);
883ab45ba71SJames Collins                    $html .= '</div>';
884a8eebd82SJames Collins                    break;
885a8eebd82SJames Collins                case 'dokuwiki':
8869cff245bSJames Collins                    $html .= $this->includeDWMenu(false);
887a8eebd82SJames Collins                    break;
888a8eebd82SJames Collins            }
889a8eebd82SJames Collins        }
890ab45ba71SJames Collins
891ab45ba71SJames Collins        $html .= '</div>';
892f8039bf2SJames Collins        $html .= '</div>';
893ab45ba71SJames Collins        $html .= '</nav>';
894ab45ba71SJames Collins
895a8eebd82SJames Collins        // Sub Navbar
8969cff245bSJames Collins        if ($showSub === true) {
8979cff245bSJames Collins            $sub = $this->includePage('submenu', false);
8983a385f2cSJames Collins            if (empty($sub) === false) {
8999cff245bSJames Collins                $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>';
9009cff245bSJames Collins            }
901ab45ba71SJames Collins        }
902ab45ba71SJames Collins
9039cff245bSJames Collins        if ($print === true) {
9049cff245bSJames Collins            echo $html;
9059cff245bSJames Collins        }
906ab45ba71SJames Collins        return $html;
907ab45ba71SJames Collins    }
908ab45ba71SJames Collins
909ab45ba71SJames Collins
910a8eebd82SJames Collins    /**
911a8eebd82SJames Collins     * Is there a sidebar
912a8eebd82SJames Collins     *
9139cff245bSJames Collins     * @param   string $prefix Sidebar prefix to use when searching.
914a8eebd82SJames Collins     * @return  boolean        if sidebar exists
915a8eebd82SJames Collins     */
9169cff245bSJames Collins    public function sidebarExists(string $prefix = '')
91710b40067Snomadjimbob    {
918a8eebd82SJames Collins        global $conf;
919a8eebd82SJames Collins
9203a385f2cSJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9219cff245bSJames Collins            $prefix = '';
9229cff245bSJames Collins        }
923a8eebd82SJames Collins
924a8eebd82SJames Collins        return $this->pageExists($conf['sidebar' . $prefix]);
925a8eebd82SJames Collins    }
926a8eebd82SJames Collins
927a8eebd82SJames Collins
928a8eebd82SJames Collins    /**
929ab45ba71SJames Collins     * Print or return the sidebar content
930ab45ba71SJames Collins     *
9319cff245bSJames Collins     * @param   string  $prefix Sidebar prefix to use when searching.
9329cff245bSJames Collins     * @param   boolean $print  Print the generated content to the output buffer.
9339cff245bSJames Collins     * @param   boolean $parse  Parse the content.
934ab45ba71SJames Collins     * @return  string          generated content
935ab45ba71SJames Collins     */
9369cff245bSJames Collins    public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true)
93710b40067Snomadjimbob    {
938ab45ba71SJames Collins        global $conf, $ID;
939ab45ba71SJames Collins
940ab45ba71SJames Collins        $html = '';
941ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
942ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
943ab45ba71SJames Collins
9443a385f2cSJames Collins        if (empty($confPrefix) === true) {
9459cff245bSJames Collins            $confPrefix = 'Left';
9469cff245bSJames Collins        }
9471cdedf28SJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9489cff245bSJames Collins            $prefix = '';
9499cff245bSJames Collins        }
950ab45ba71SJames Collins
9511cdedf28SJames Collins        $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar'];
952ab45ba71SJames Collins
9539cff245bSJames Collins        if (
9549cff245bSJames Collins            $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false &&
9551cdedf28SJames Collins            p_get_metadata($ID, 'nosidebar', false) === null
9569cff245bSJames Collins        ) {
9579cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'header', false);
9583a385f2cSJames Collins            if (empty($content) === false) {
9599cff245bSJames Collins                $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
9609cff245bSJames Collins            }
961ab45ba71SJames Collins
9623a385f2cSJames Collins            if (empty($prefix) === true) {
9639cff245bSJames Collins                $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'),
9649cff245bSJames Collins                    $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4')
9659cff245bSJames Collins                ];
966ab45ba71SJames Collins
967a8eebd82SJames Collins                foreach ($rows as $row) {
968a8eebd82SJames Collins                    switch ($row) {
969a8eebd82SJames Collins                        case 'search':
9709cff245bSJames Collins                            $html .= $this->includeSearch(false);
971a8eebd82SJames Collins                            break;
972a8eebd82SJames Collins                        case 'logged in user':
9739cff245bSJames Collins                            $html .= $this->includeLoggedIn(false);
974a8eebd82SJames Collins                            break;
975a8eebd82SJames Collins                        case 'content':
9769cff245bSJames Collins                            $content = $this->includePage($sidebarPage, false);
9773a385f2cSJames Collins                            if (empty($content) === false) {
9789cff245bSJames Collins                                $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9799cff245bSJames Collins                            }
980a8eebd82SJames Collins                            break;
981a8eebd82SJames Collins                        case 'tags':
982a8eebd82SJames Collins                            $html .= '<div class="mikio-tags"></div>';
983a8eebd82SJames Collins                    }
984a8eebd82SJames Collins                }
985a8eebd82SJames Collins            } else {
9869cff245bSJames Collins                $content = $this->includePage($sidebarPage, false);
9873a385f2cSJames Collins                if (empty($content) === false) {
9889cff245bSJames Collins                    $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9899cff245bSJames Collins                }
9909cff245bSJames Collins            }//end if
9919cff245bSJames Collins
9929cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'footer', false);
9933a385f2cSJames Collins            if (empty($content) === false) {
9949cff245bSJames Collins                $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
9959cff245bSJames Collins            }
9969cff245bSJames Collins        }//end if
9979cff245bSJames Collins
9983a385f2cSJames Collins        if (empty($html) === true) {
9993a385f2cSJames Collins            if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) {
10009cff245bSJames Collins                $html = '&nbsp;';
10019cff245bSJames Collins            }
10029cff245bSJames Collins            if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) {
10039cff245bSJames Collins                $html = '&nbsp;';
10049cff245bSJames Collins            }
1005a8eebd82SJames Collins        }
1006ab45ba71SJames Collins
10073a385f2cSJames Collins        if (empty($html) === false) {
10081cdedf28SJames Collins            $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) .
10099cff245bSJames Collins                '"><a class="mikio-sidebar-toggle' .
10109cff245bSJames Collins                ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' .
10119cff245bSJames Collins                tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' .
10129cff245bSJames Collins                $html . '</div></aside>';
1013ab45ba71SJames Collins        }
1014ab45ba71SJames Collins
10159cff245bSJames Collins        if ($parse === true) {
10169cff245bSJames Collins            $html = $this->includeIcons($html);
10173a04a100SJames Collins        }
10189cff245bSJames Collins        if ($print === true) {
10199cff245bSJames Collins            echo $html;
1020ab45ba71SJames Collins        }
10214f8225e4SJames Collins
1022ab45ba71SJames Collins        return $html;
1023ab45ba71SJames Collins    }
1024ab45ba71SJames Collins
1025ab45ba71SJames Collins
1026a8eebd82SJames Collins    /**
1027ab45ba71SJames Collins     * Print or return the page tools content
1028ab45ba71SJames Collins     *
10299cff245bSJames Collins     * @param   boolean $print     Print the generated content to the output buffer.
10309cff245bSJames Collins     * @param   boolean $includeId Include the dw__pagetools id in the element.
1031ab45ba71SJames Collins     * @return  string             generated content
1032ab45ba71SJames Collins     */
10339cff245bSJames Collins    public function includePageTools(bool $print = true, bool $includeId = false)
103410b40067Snomadjimbob    {
10351293ce10SJames Collins        global $USERINFO;
10361293ce10SJames Collins
10379cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
1038ab45ba71SJames Collins        $html = '';
1039ab45ba71SJames Collins
10409cff245bSJames Collins        $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
1041b9c0582bSJames Collins        $html .= '<ul class="tools">';
1042ab45ba71SJames Collins
1043ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
1044ab45ba71SJames Collins        foreach ($items as $item) {
10459cff245bSJames Collins            $classes = [];
10463fd763a0SJames Collins            $classes[] = $item->getType();
10473fd763a0SJames Collins            $attr = $item->getLinkAttributes();
10483fd763a0SJames Collins
10499cff245bSJames Collins            if (empty($attr['class']) === false) {
10503fd763a0SJames Collins                $classes = array_merge($classes, explode(' ', $attr['class']));
1051ab45ba71SJames Collins            }
1052ab45ba71SJames Collins
10533fd763a0SJames Collins            $classes = array_unique($classes);
10543fd763a0SJames Collins
10551293ce10SJames Collins            $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()));
10569cff245bSJames Collins            if (
10573a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
10583a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
10593a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true))
10609cff245bSJames Collins            ) {
10613fd763a0SJames Collins                $html .= '<li class="' . implode(' ', $classes) . '">';
10629cff245bSJames Collins                $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' .
10639cff245bSJames Collins                    $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) .
10649cff245bSJames Collins                    '</div><span class="a11y">' . $item->getLabel() . '</span></a>';
10653fd763a0SJames Collins                $html .= '</li>';
10663fd763a0SJames Collins            }
10679cff245bSJames Collins        }//end foreach
10683fd763a0SJames Collins
10693fd763a0SJames Collins        $html .= '</ul>';
1070ab45ba71SJames Collins        $html .= '</nav>';
1071ab45ba71SJames Collins
10729cff245bSJames Collins        if ($print === true) {
10739cff245bSJames Collins            echo $html;
10749cff245bSJames Collins        }
1075ab45ba71SJames Collins        return $html;
1076ab45ba71SJames Collins    }
1077ab45ba71SJames Collins
1078ab45ba71SJames Collins
1079a8eebd82SJames Collins    /**
1080a8eebd82SJames Collins     * Print or return the search bar
1081a8eebd82SJames Collins     *
10829cff245bSJames Collins     * @param   boolean $print Print content.
1083a8eebd82SJames Collins     * @return  string         contents of the search bar
1084a8eebd82SJames Collins     */
10859cff245bSJames Collins    public function includeSearch(bool $print = true)
108610b40067Snomadjimbob    {
10879cff245bSJames Collins        global $lang, $ID, $ACT, $QUERY;
1088ab45ba71SJames Collins        $html = '';
1089ab45ba71SJames Collins
10909cff245bSJames Collins        $html .= '<form class="mikio-search search" action="' . wl() .
10919cff245bSJames Collins            '" accept-charset="utf-8" method="get" role="search">';
1092a8eebd82SJames Collins        $html .= '<input type="hidden" name="do" value="search">';
1093a8eebd82SJames Collins        $html .= '<input type="hidden" name="id" value="' . $ID . '">';
1094c1cb9f15SChris MacMackin        $html .= '<input name="q" ';
10959cff245bSJames Collins        if ($this->getConf('searchUseTypeahead') === true) {
1096c1cb9f15SChris MacMackin            $html .= 'class="search_typeahead" ';
1097c1cb9f15SChris MacMackin        }
10989cff245bSJames Collins        $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' .
10993a385f2cSJames Collins            ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
1100a8eebd82SJames Collins        $html .= '<button type="submit" title="' .  $lang['btn_search'] . '">';
11013a385f2cSJames Collins        if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) {
1102a8eebd82SJames Collins            $html .= $this->mikioInlineIcon('search');
1103ab45ba71SJames Collins        } else {
1104ab45ba71SJames Collins            $html .= $lang['btn_search'];
1105ab45ba71SJames Collins        }
1106ab45ba71SJames Collins        $html .= '</button>';
1107ab45ba71SJames Collins        $html .= '</form>';
1108ab45ba71SJames Collins
11099cff245bSJames Collins        if ($print === true) {
11109cff245bSJames Collins            echo $html;
11119cff245bSJames Collins        }
1112ab45ba71SJames Collins        return $html;
1113ab45ba71SJames Collins    }
1114ab45ba71SJames Collins
1115ab45ba71SJames Collins
1116a8eebd82SJames Collins    /**
1117a8eebd82SJames Collins     * Print or return content
1118a8eebd82SJames Collins     *
11199cff245bSJames Collins     * @param   boolean $print Print content.
1120a8eebd82SJames Collins     * @return  string         contents
1121a8eebd82SJames Collins     */
11229cff245bSJames Collins    public function includeContent(bool $print = true)
112310b40067Snomadjimbob    {
1124ab45ba71SJames Collins        ob_start();
11259cff245bSJames Collins        tpl_content(false);
1126ab45ba71SJames Collins        $html = ob_get_contents();
1127ab45ba71SJames Collins        ob_end_clean();
1128ab45ba71SJames Collins
1129ab45ba71SJames Collins        $html = $this->includeIcons($html);
1130ab45ba71SJames Collins        $html = $this->parseContent($html);
1131ab45ba71SJames Collins
1132ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
1133ab45ba71SJames Collins
11349cff245bSJames Collins        if ($this->getConf('heroTitle') === false) {
11359cff245bSJames Collins            $html = '<div class="mikio-tags"></div>' . $html;
11369cff245bSJames Collins        }
1137a8eebd82SJames Collins
1138a8eebd82SJames Collins        $html = '<div class="mikio-article-content">' . $html . '</div>';
1139a8eebd82SJames Collins
11409cff245bSJames Collins        if ($print === true) {
11419cff245bSJames Collins            echo $html;
11429cff245bSJames Collins        }
1143ab45ba71SJames Collins        return $html;
1144ab45ba71SJames Collins    }
1145ab45ba71SJames Collins
1146a8eebd82SJames Collins    /**
1147ab45ba71SJames Collins     * Print or return footer
1148ab45ba71SJames Collins     *
11499cff245bSJames Collins     * @param   boolean $print Print footer.
11509cff245bSJames Collins     * @return  string         HTML string containing footer
1151ab45ba71SJames Collins     */
11529cff245bSJames Collins    public function includeFooter(bool $print = true)
115310b40067Snomadjimbob    {
1154ab45ba71SJames Collins        global $ACT;
1155ab45ba71SJames Collins
1156ab45ba71SJames Collins        $html = '';
1157ab45ba71SJames Collins
1158ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
11599cff245bSJames Collins        $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>';
11609cff245bSJames Collins        $html .= $this->includePage('footer', false);
1161ab45ba71SJames Collins
1162a8eebd82SJames Collins        $html .= $this->stringToNav($this->getConf('footerCustomMenuText'));
1163ab45ba71SJames Collins
11649cff245bSJames Collins        if ($this->getConf('footerSearch') === true) {
1165ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
11669cff245bSJames Collins            $html .= $this->includeSearch(false);
1167ab45ba71SJames Collins            $html .= '</div>';
1168ab45ba71SJames Collins        }
1169ab45ba71SJames Collins
1170a8eebd82SJames Collins        $showPageTools = $this->getConf('pageToolsFooter');
11719cff245bSJames Collins        if (
11723a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 ||
11733a385f2cSJames Collins            $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0)
11749cff245bSJames Collins        ) {
11759cff245bSJames Collins            $html .= $this->includePageTools(false);
11769cff245bSJames Collins        }
1177ab45ba71SJames Collins
11789cff245bSJames Collins        $meta['licenseType']            = ['multichoice', '_choices' => ['none', 'badge', 'button']];
11799cff245bSJames Collins        $meta['licenseImageOnly']       = ['onoff'];
1180ab45ba71SJames Collins
1181ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
11829cff245bSJames Collins        if ($licenseType !== 'none') {
11839cff245bSJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true);
1184ab45ba71SJames Collins        }
1185ab45ba71SJames Collins
1186ab45ba71SJames Collins        $html .= '</footer>';
1187ab45ba71SJames Collins
11889cff245bSJames Collins        if ($print === true) {
11899cff245bSJames Collins            echo $html;
11909cff245bSJames Collins        }
1191ab45ba71SJames Collins        return $html;
1192ab45ba71SJames Collins    }
1193ab45ba71SJames Collins
1194ab45ba71SJames Collins
1195a8eebd82SJames Collins    /**
1196ab45ba71SJames Collins     * Print or return breadcrumb trail
1197ab45ba71SJames Collins     *
11989cff245bSJames Collins     * @param   boolean $print Print out trail.
11999cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12009cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
1201ab45ba71SJames Collins     */
12029cff245bSJames Collins    public function includeBreadcrumbs(bool $print = true, bool $parse = true)
120310b40067Snomadjimbob    {
1204a8eebd82SJames Collins        global $conf, $ID, $lang, $ACT;
1205a8eebd82SJames Collins
12063a385f2cSJames Collins        if (
12073a385f2cSJames Collins            $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 &&
120895372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0
12093a385f2cSJames Collins        ) {
12109cff245bSJames Collins            return '';
12119cff245bSJames Collins        }
1212ab45ba71SJames Collins
1213ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
1214f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
12153a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
121695372bffSJames Collins            if ($conf['breadcrumbs'] !== 0) {
12179cff245bSJames Collins                if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) {
1218ab45ba71SJames Collins                    ob_start();
121975adba86SJames Collins                    tpl_breadcrumbs();
1220ab45ba71SJames Collins                    $html .= ob_get_contents();
1221ab45ba71SJames Collins                    ob_end_clean();
1222ab45ba71SJames Collins                } else {
1223ab45ba71SJames Collins                    $sep = '•';
1224ab45ba71SJames Collins                    $prefix = $lang['breadcrumb'];
1225ab45ba71SJames Collins
12269cff245bSJames Collins                    if ($this->getConf('breadcrumbSep') === true) {
1227ab45ba71SJames Collins                        $sep = $this->getConf('breadcrumbSepText');
12289cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-sep', false);
1229ab45ba71SJames Collins
12309cff245bSJames Collins                        if ($img !== false) {
1231ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1232ab45ba71SJames Collins                        }
123347161538SJames Collins                    }
123447161538SJames Collins
12359cff245bSJames Collins                    if ($this->getConf('breadcrumbPrefix') === true) {
1236ab45ba71SJames Collins                        $prefix = $this->getConf('breadcrumbPrefixText');
12379cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-prefix', false);
1238ab45ba71SJames Collins
12399cff245bSJames Collins                        if ($img !== false) {
1240ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
1241ab45ba71SJames Collins                        }
1242ab45ba71SJames Collins                    }
1243ab45ba71SJames Collins
1244ab45ba71SJames Collins                    $crumbs = breadcrumbs();
1245ab45ba71SJames Collins
1246ab45ba71SJames Collins                    $html .= '<ul>';
12473a385f2cSJames Collins                    if (empty($prefix) === false) {
12489cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12499cff245bSJames Collins                    }
1250ab45ba71SJames Collins
1251ab45ba71SJames Collins                    $last = count($crumbs);
1252ab45ba71SJames Collins                    $i    = 0;
1253ab45ba71SJames Collins                    foreach ($crumbs as $id => $name) {
1254ab45ba71SJames Collins                        $i++;
125595372bffSJames Collins                        if ($i !== 1) {
1256ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
125795372bffSJames Collins                        }
12589cff245bSJames Collins                        $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>';
12599cff245bSJames Collins                        $html .= tpl_pagelink($id, null, true);
1260ab45ba71SJames Collins                        $html .= '</li>';
1261ab45ba71SJames Collins                    }
1262ab45ba71SJames Collins
1263ab45ba71SJames Collins                    $html .= '</ul>';
12649cff245bSJames Collins                }//end if
12659cff245bSJames Collins            }//end if
12669cff245bSJames Collins        }//end if
12673d11a778SJames Collins
12683d11a778SJames Collins        $html .= '</div>';
12693d11a778SJames Collins        $html .= '</div>';
12703d11a778SJames Collins
12719cff245bSJames Collins        if ($parse === true) {
12729cff245bSJames Collins            $html = $this->includeIcons($html);
12739cff245bSJames Collins        }
12749cff245bSJames Collins        if ($print === true) {
12759cff245bSJames Collins            echo $html;
12769cff245bSJames Collins        }
12773d11a778SJames Collins        return $html;
12783d11a778SJames Collins    }
12793d11a778SJames Collins
12803d11a778SJames Collins    /**
12813d11a778SJames Collins     * Print or return you are here trail
12823d11a778SJames Collins     *
12839cff245bSJames Collins     * @param   boolean $print Print out trail.
12849cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12859cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
12863d11a778SJames Collins     */
12879cff245bSJames Collins    public function includeYouAreHere(bool $print = true, bool $parse = true)
12883d11a778SJames Collins    {
12893d11a778SJames Collins        global $conf, $ID, $lang, $ACT;
12903d11a778SJames Collins
12913a385f2cSJames Collins        if (
12923a385f2cSJames Collins            $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 &&
129395372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0
12943a385f2cSJames Collins        ) {
12959cff245bSJames Collins            return '';
12969cff245bSJames Collins        }
12973d11a778SJames Collins
12983d11a778SJames Collins        $html = '<div class="mikio-youarehere">';
12993d11a778SJames Collins        $html .= '<div class="mikio-container">';
13003a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
130195372bffSJames Collins            if ($conf['youarehere'] !== 0) {
13029cff245bSJames Collins                if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) {
130395372bffSJames Collins                    $html .= '<div class="mikio-bcdw">';
1304ab45ba71SJames Collins                    ob_start();
130575adba86SJames Collins                    tpl_youarehere();
1306ab45ba71SJames Collins                    $html .= ob_get_contents();
1307ab45ba71SJames Collins                    ob_end_clean();
130895372bffSJames Collins                    $html .= '</div>';
1309ab45ba71SJames Collins                } else {
1310ab45ba71SJames Collins                    $sep = ' » ';
1311ab45ba71SJames Collins                    $prefix = $lang['youarehere'];
1312ab45ba71SJames Collins
13139cff245bSJames Collins                    if ($this->getConf('youarehereSep') === true) {
13143d11a778SJames Collins                        $sep = $this->getConf('youarehereSepText');
13159cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-sep', false);
1316ab45ba71SJames Collins
13179cff245bSJames Collins                        if ($img !== false) {
1318ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1319ab45ba71SJames Collins                        }
132075adba86SJames Collins                    }
132175adba86SJames Collins
13229cff245bSJames Collins                    if ($this->getConf('youareherePrefix') === true) {
13233d11a778SJames Collins                        $prefix = $this->getConf('youareherePrefixText');
13249cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-prefix', false);
1325ab45ba71SJames Collins
13269cff245bSJames Collins                        if ($img !== false) {
1327ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
132875adba86SJames Collins                        }
132947161538SJames Collins                    }
133047161538SJames Collins
1331ab45ba71SJames Collins                    $html .= '<ul>';
13323a385f2cSJames Collins                    if (empty($prefix) === false) {
13339cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
13349cff245bSJames Collins                    }
13359cff245bSJames Collins                    $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>';
1336ab45ba71SJames Collins
1337ab45ba71SJames Collins                    $parts = explode(':', $ID);
1338ab45ba71SJames Collins                    $count = count($parts);
1339ab45ba71SJames Collins
1340ab45ba71SJames Collins                    $part = '';
13419cff245bSJames Collins                    for ($i = 0; $i < ($count - 1); $i++) {
1342ab45ba71SJames Collins                        $part .= $parts[$i] . ':';
1343ab45ba71SJames Collins                        $page = $part;
13449cff245bSJames Collins                        if ($page === $conf['start']) {
13459cff245bSJames Collins                            continue;
13469cff245bSJames Collins                        }
1347ab45ba71SJames Collins
1348ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
13499cff245bSJames Collins                        $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1350ab45ba71SJames Collins                    }
1351ab45ba71SJames Collins
1352ab45ba71SJames Collins                    resolve_pageid('', $page, $exists);
13539cff245bSJames Collins                    if ((isset($page) === true && $page === $part . $parts[$i]) === false) {
1354ab45ba71SJames Collins                        $page = $part . $parts[$i];
13559cff245bSJames Collins                        if ($page !== $conf['start']) {
1356ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
13579cff245bSJames Collins                            $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1358ab45ba71SJames Collins                        }
1359ab45ba71SJames Collins                    }
1360ab45ba71SJames Collins
1361ab45ba71SJames Collins                    $html .= '</ul>';
13629cff245bSJames Collins                }//end if
13639cff245bSJames Collins            }//end if
1364ab45ba71SJames Collins
13653d11a778SJames Collins            $showLast = $this->getConf('youarehereShowLast');
13669cff245bSJames Collins            if ($showLast !== 0) {
1367a8eebd82SJames Collins                preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches);
13689cff245bSJames Collins                if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) {
1369a8eebd82SJames Collins                    $count = count($matches[0]);
1370a8eebd82SJames Collins                    $list = '';
1371a8eebd82SJames Collins
1372a8eebd82SJames Collins                    // Show Home
1373a8eebd82SJames Collins                    $list .= $matches[0][0] . $matches[0][1];
1374a8eebd82SJames Collins
1375a8eebd82SJames Collins                    $list .= '<li>...</li>';
13769cff245bSJames Collins                    for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) {
1377a8eebd82SJames Collins                        $list .= $matches[0][$i];
1378a8eebd82SJames Collins                    }
1379a8eebd82SJames Collins
1380a8eebd82SJames Collins                    $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html);
1381a8eebd82SJames Collins                }
1382a8eebd82SJames Collins            }
1383a8eebd82SJames Collins
13843d11a778SJames Collins            switch ($this->getConf('youarehereHome')) {
1385a8eebd82SJames Collins                case 'none':
1386a8eebd82SJames Collins                    $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2);
1387a8eebd82SJames Collins                    break;
1388a8eebd82SJames Collins                case 'home':
1389a8eebd82SJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1);
1390a8eebd82SJames Collins                    break;
1391a8eebd82SJames Collins                case 'icon':
13929cff245bSJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' .
13939cff245bSJames Collins                        $this->mikioInlineIcon('home') . '$3', $html, 1);
1394a8eebd82SJames Collins                    break;
1395a8eebd82SJames Collins            }
1396a8eebd82SJames Collins        } else {
1397a8eebd82SJames Collins            $html .= '&#8810; ';
13989cff245bSJames Collins            if (isset($_GET['page']) === true) {
13999cff245bSJames Collins                $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
1400a8eebd82SJames Collins            }
14014057121fSJames Collins            $html .= '<a href="' . wl($ID) . '">View Page</a>';
14029cff245bSJames Collins        }//end if
14039cff245bSJames Collins
14049cff245bSJames Collins        $html .= '</div>';
14059cff245bSJames Collins        $html .= '</div>';
14069cff245bSJames Collins
14079cff245bSJames Collins        if ($parse === true) {
14089cff245bSJames Collins            $html = $this->includeIcons($html);
1409a8eebd82SJames Collins        }
14109cff245bSJames Collins        if ($print === true) {
14119cff245bSJames Collins            echo $html;
14129cff245bSJames Collins        }
1413ab45ba71SJames Collins        return $html;
1414ab45ba71SJames Collins    }
1415ab45ba71SJames Collins
14161785fc73SJames Collins    /**
14171785fc73SJames Collins     * Get Page Title
14189cff245bSJames Collins     *
14199cff245bSJames Collins     * @return string page title
14201785fc73SJames Collins     */
142110b40067Snomadjimbob    public function parsePageTitle()
142210b40067Snomadjimbob    {
14232060e56cSJames Collins        global $ID;
14242060e56cSJames Collins
14252060e56cSJames Collins        $title = p_get_first_heading($ID);
14269cff245bSJames Collins        if (strlen($title) <= 0) {
14279cff245bSJames Collins            $title = tpl_pagetitle(null, true);
14289cff245bSJames Collins        }
14291785fc73SJames Collins        $title = $this->includeIcons($title);
14301785fc73SJames Collins
14311785fc73SJames Collins        return $title;
14321785fc73SJames Collins    }
14331785fc73SJames Collins
1434ab45ba71SJames Collins
143575adba86SJames Collins    /**
1436a8eebd82SJames Collins     * Print or return hero block
143775adba86SJames Collins     *
14389cff245bSJames Collins     * @param   boolean $print Print content.
1439a8eebd82SJames Collins     * @return  string         contents of hero
144075adba86SJames Collins     */
14419cff245bSJames Collins    public function includeHero(bool $print = true)
144210b40067Snomadjimbob    {
1443a8eebd82SJames Collins        $html = '';
144447161538SJames Collins
14459cff245bSJames Collins        if ($this->getConf('heroTitle') === true) {
1446a8eebd82SJames Collins            $html .= '<div class="mikio-hero">';
1447f8039bf2SJames Collins            $html .= '<div class="mikio-container">';
1448a8eebd82SJames Collins            $html .= '<div class="mikio-hero-text">';
14493a385f2cSJames Collins            if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) {
14509cff245bSJames Collins                $html .= $this->includeYouAreHere(false);
14519cff245bSJames Collins            }
14523a385f2cSJames Collins            if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) {
14539cff245bSJames Collins                $html .= $this->includeBreadcrumbs(false);
14549cff245bSJames Collins            }
1455ab45ba71SJames Collins
1456a8eebd82SJames Collins            $html .= '<h1 class="mikio-hero-title">';
14571785fc73SJames Collins            $html .= $this->parsePageTitle();    // No idea why this requires a blank space afterwards to work?
1458a8eebd82SJames Collins            $html .= '</h1>';
1459a8eebd82SJames Collins            $html .= '<h2 class="mikio-hero-subtitle"></h2>';
1460a8eebd82SJames Collins            $html .= '</div>';
146147161538SJames Collins
14629cff245bSJames Collins            $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true));
1463a8eebd82SJames Collins            $hero_image_resize_class = '';
14643a385f2cSJames Collins            if (empty($hero_image) === false) {
1465a8eebd82SJames Collins                $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"';
1466a8eebd82SJames Collins                $hero_image_resize_class = ' mikio-hero-image-resize';
146747161538SJames Collins            }
1468a8eebd82SJames Collins
14699cff245bSJames Collins            $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image .
14709cff245bSJames Collins                '><div class="mikio-tags"></div></div>';
1471a8eebd82SJames Collins
1472a8eebd82SJames Collins            $html .= '</div>';
1473f8039bf2SJames Collins            $html .= '</div>';
14749cff245bSJames Collins        }//end if
14759cff245bSJames Collins
14769cff245bSJames Collins        if ($print === true) {
14779cff245bSJames Collins            echo $html;
147875adba86SJames Collins        }
1479a8eebd82SJames Collins
1480a8eebd82SJames Collins        return $html;
148175adba86SJames Collins    }
148275adba86SJames Collins
148375adba86SJames Collins
148475adba86SJames Collins    /**
1485a8eebd82SJames Collins     * Print or return out TOC
148675adba86SJames Collins     *
14879cff245bSJames Collins     * @param   boolean $print Print TOC.
14889cff245bSJames Collins     * @param   boolean $parse Parse icons.
1489a8eebd82SJames Collins     * @return  string         contents of TOC
149075adba86SJames Collins     */
14919cff245bSJames Collins    public function includeTOC(bool $print = true, bool $parse = true)
149210b40067Snomadjimbob    {
1493ab45ba71SJames Collins        $html = '';
14942b4583abSJames Collins
1495ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
1496ab45ba71SJames Collins
14973a385f2cSJames Collins        if (empty($tocHtml) === false) {
1498f65a4e5eSJames Collins            $tocHtml = preg_replace(
1499f65a4e5eSJames Collins                '/(<h3.+?toggle.+?>)(.+?)<\/h3>/',
1500f65a4e5eSJames Collins                '$1' .
1501f65a4e5eSJames Collins                $this->mikioInlineIcon('hamburger', 'hamburger') . '$2' .
1502f65a4e5eSJames Collins                $this->mikioInlineIcon('down-arrow', 'down-arrow') . '</h3>',
1503f65a4e5eSJames Collins                $tocHtml
1504f65a4e5eSJames Collins            );
1505ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
1506a8eebd82SJames Collins            $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml);
1507ab45ba71SJames Collins
1508ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
1509ab45ba71SJames Collins            $html .= $tocHtml;
1510ab45ba71SJames Collins            $html .= '</div>';
15112b4583abSJames Collins        }
15122b4583abSJames Collins
15139cff245bSJames Collins        if ($parse === true) {
15149cff245bSJames Collins            $html = $this->includeIcons($html);
15159cff245bSJames Collins        }
15169cff245bSJames Collins
15179cff245bSJames Collins        if ($print === true) {
1518ab45ba71SJames Collins            echo $html;
1519ab45ba71SJames Collins        }
1520ab45ba71SJames Collins
15219cff245bSJames Collins        return $html;
15229cff245bSJames Collins    }
15239cff245bSJames Collins
1524ab45ba71SJames Collins
1525a8eebd82SJames Collins    /**
1526ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
1527ab45ba71SJames Collins     *
15289cff245bSJames Collins     * @param   string $str Content to parse.
1529ab45ba71SJames Collins     * @return  string      parsed string
1530ab45ba71SJames Collins     */
15319cff245bSJames Collins    public function includeIcons(string $str)
153210b40067Snomadjimbob    {
1533ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
1534ab45ba71SJames Collins
1535ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
15363a385f2cSJames Collins        if (empty($iconTag) === true) {
15379cff245bSJames Collins            return $str;
15389cff245bSJames Collins        }
1539ab45ba71SJames Collins
15409cff245bSJames Collins        if (
15419cff245bSJames Collins            in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true ||
15423a385f2cSJames Collins            strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0
15439cff245bSJames Collins        ) {
1544a2005a27SJames Collins            $content = $str;
1545a2005a27SJames Collins            $preview = null;
1546a2005a27SJames Collins
15473a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15489cff245bSJames Collins                $html = new \simple_html_dom();
1549a2005a27SJames Collins                $html->stripRNAttrValues = false;
1550a2005a27SJames Collins                $html->load($str, true, false);
1551a2005a27SJames Collins
1552a2005a27SJames Collins                $preview = $html->find('div.preview');
15539cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1554a2005a27SJames Collins                    $content = $preview[0]->innertext;
1555a2005a27SJames Collins                }
1556a2005a27SJames Collins            }
1557a2005a27SJames Collins
15581785fc73SJames Collins            $page_regex = '/(.*)/';
15599cff245bSJames Collins            if (stripos($str, '<pre') !== false) {
15601785fc73SJames Collins                $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/';
15611785fc73SJames Collins            }
15621785fc73SJames Collins
15631785fc73SJames Collins            $content = preg_replace_callback($page_regex, function ($icons) {
1564a2005a27SJames Collins                $iconTag = $this->getConf('iconTag', 'icon');
1565a2005a27SJames Collins
156610b40067Snomadjimbob                return preg_replace_callback(
156710b40067Snomadjimbob                    '/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
1568ab45ba71SJames Collins                    function ($matches) {
1569ab45ba71SJames Collins                        global $MIKIO_ICONS;
1570ab45ba71SJames Collins
1571ab45ba71SJames Collins                        $s = $matches[0];
1572ab45ba71SJames Collins
1573ab45ba71SJames Collins                        if (count($MIKIO_ICONS) > 0) {
1574ab45ba71SJames Collins                            $icon = $MIKIO_ICONS[0];
1575ab45ba71SJames Collins
1576ab45ba71SJames Collins                            if (count($matches) > 1) {
1577ab45ba71SJames Collins                                $e = explode(' ', $matches[1]);
1578ab45ba71SJames Collins
1579ab45ba71SJames Collins                                if (count($e) > 1) {
1580ab45ba71SJames Collins                                    foreach ($MIKIO_ICONS as $iconItem) {
15819cff245bSJames Collins                                        if (strcasecmp($iconItem['name'], $e[0]) === 0) {
1582ab45ba71SJames Collins                                            $icon = $iconItem;
1583ab45ba71SJames Collins
1584ab45ba71SJames Collins                                            $s = $icon['insert'];
1585ab45ba71SJames Collins                                            for ($i = 1; $i < 9; $i++) {
15861cdedf28SJames Collins                                                if (count($e) < $i || empty($e[$i]) === true) {
15879cff245bSJames Collins                                                    if (isset($icon['$' . $i]) === true) {
1588ab45ba71SJames Collins                                                        $s = str_replace('$' . $i, $icon['$' . $i], $s);
1589ab45ba71SJames Collins                                                    }
1590ab45ba71SJames Collins                                                } else {
1591ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $e[$i], $s);
1592ab45ba71SJames Collins                                                }
1593ab45ba71SJames Collins                                            }
1594ab45ba71SJames Collins
1595ab45ba71SJames Collins                                            $dir = '';
15969cff245bSJames Collins                                            if (isset($icon['dir']) === true) {
15979cff245bSJames Collins                                                $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
15989cff245bSJames Collins                                            }
1599ab45ba71SJames Collins
1600ab45ba71SJames Collins                                            $s = str_replace('$0', $dir, $s);
1601ab45ba71SJames Collins
1602ab45ba71SJames Collins                                            break;
16039cff245bSJames Collins                                        }//end if
16049cff245bSJames Collins                                    }//end foreach
1605ab45ba71SJames Collins                                } else {
1606ab45ba71SJames Collins                                    $s = str_replace('$1', $matches[1], $icon['insert']);
16079cff245bSJames Collins                                }//end if
16089cff245bSJames Collins                            }//end if
16099cff245bSJames Collins                        }//end if
161075adba86SJames Collins
1611ab45ba71SJames Collins                        $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
16129cff245bSJames Collins                        if ($count === 0) {
1613ab45ba71SJames Collins                            $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
1614ab45ba71SJames Collins                        }
1615ab45ba71SJames Collins
1616ab45ba71SJames Collins                        return $s;
1617ab45ba71SJames Collins                    },
161810b40067Snomadjimbob                    $icons[0]
161910b40067Snomadjimbob                );
1620a2005a27SJames Collins            }, $content);
1621a2005a27SJames Collins
16223a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
16239cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1624a2005a27SJames Collins                    $preview[0]->innertext = $content;
1625a2005a27SJames Collins                }
1626a2005a27SJames Collins
1627a2005a27SJames Collins                $str = $html->save();
1628a2005a27SJames Collins                $html->clear();
1629a2005a27SJames Collins                unset($html);
1630a2005a27SJames Collins            } else {
1631a2005a27SJames Collins                $str = $content;
1632a2005a27SJames Collins            }
16339cff245bSJames Collins        }//end if
1634ab45ba71SJames Collins
1635ab45ba71SJames Collins        return $str;
1636ab45ba71SJames Collins    }
163747161538SJames Collins
1638c165b184SJames Collins    /**
1639a8eebd82SJames Collins     * Parse HTML for theme
1640c165b184SJames Collins     *
16419cff245bSJames Collins     * @param   string $content HTML content to parse.
1642a8eebd82SJames Collins     * @return  string          Parsed content
1643c165b184SJames Collins     */
16449cff245bSJames Collins    public function parseContent(string $content)
164510b40067Snomadjimbob    {
1646ab45ba71SJames Collins        global $INPUT, $ACT;
1647ab45ba71SJames Collins
1648a8eebd82SJames Collins        // Add Mikio Section titles
16493a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
16509cff245bSJames Collins            $admin_sections = [
1651ab45ba71SJames Collins                // Section      Insert Before                 Icon
16529cff245bSJames Collins                'navbar'        => ['navbarUseTitleIcon',      ''],
16539cff245bSJames Collins                'search'        => ['searchButton',            ''],
16549cff245bSJames Collins                'hero'          => ['heroTitle',               ''],
16559cff245bSJames Collins                'tags'          => ['tagsConsolidate',         ''],
16569cff245bSJames Collins                'breadcrumb'    => ['breadcrumbHideHome',      ''],
16579cff245bSJames Collins                'youarehere'    => ['youarehereHideHome',      ''],
16589cff245bSJames Collins                'sidebar'       => ['sidebarShowLeft',         ''],
16599cff245bSJames Collins                'toc'           => ['tocFull',                 ''],
16609cff245bSJames Collins                'pagetools'     => ['pageToolsFloating',       ''],
16619cff245bSJames Collins                'footer'        => ['footerCustomMenuText',    ''],
16629cff245bSJames Collins                'license'       => ['licenseType',             ''],
16639cff245bSJames Collins                'acl'           => ['includePageUseACL',       ''],
16649cff245bSJames Collins                'sticky'        => ['stickyTopHeader',         ''],
16659cff245bSJames Collins            ];
1666ab45ba71SJames Collins
1667ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
1668ab45ba71SJames Collins                $search = $items[0];
1669ab45ba71SJames Collins                $icon   = $items[1];
1670ab45ba71SJames Collins
167110b40067Snomadjimbob                $content = preg_replace(
1672adf52ebbSJames Collins                    '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/',
16739cff245bSJames Collins                    '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) .
16749cff245bSJames Collins                        tpl_getLang('config_' . $section) .
16759cff245bSJames Collins                        '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' .
16769cff245bSJames Collins                        $search . '</span>',
167710b40067Snomadjimbob                    $content
167810b40067Snomadjimbob                );
1679ab45ba71SJames Collins            }
1680bb5a3dd1SJames Collins        } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) {
1681ad182e6dSnomadjimbob            $mikioPluginMissing = true;
1682ad182e6dSnomadjimbob            /* Hide plugin fields if not installed */
16839ffe9161Snomadjimbob            if (plugin_load('action', 'mikioplugin') !== null) {
1684ad182e6dSnomadjimbob                $mikioPluginMissing = false;
1685ad182e6dSnomadjimbob            }
1686ad182e6dSnomadjimbob
1687cee81679SJames Collins            $style_headers = [
1688f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__text_'],
1689f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__code_'],
1690f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__control_'],
1691f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__topheader_'],
1692f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__navbar_'],
1693f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar_'],
1694f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__tag_background_color_'],
1695f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb_'],
1696f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__hero_'],
1697f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__sidebar_'],
1698f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__content_'],
1699f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__toc_'],
1700f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__pagetools_'],
1701f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__footer_'],
1702f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__table_'],
1703f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__dropdown_'],
1704f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__section_edit_'],
1705f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__tree_'],
1706f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__tab_'],
1707ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin', 'starts_with' => '__plugin_', 'heading' => 'h2',
17089ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17099ffe9161Snomadjimbob                ],
1710ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_primary_', 'hidden' => $mikioPluginMissing],
1711ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_secondary_',
17129ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17139ffe9161Snomadjimbob                ],
1714ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_success_', 'hidden' => $mikioPluginMissing],
1715ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_danger_', 'hidden' => $mikioPluginMissing],
1716ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_warning_', 'hidden' => $mikioPluginMissing],
1717ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_info_', 'hidden' => $mikioPluginMissing],
1718ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_light_', 'hidden' => $mikioPluginMissing],
1719ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_dark_', 'hidden' => $mikioPluginMissing],
1720ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_link_', 'hidden' => $mikioPluginMissing],
1721ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_carousel_', 'hidden' => $mikioPluginMissing],
1722ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_steps_', 'hidden' => $mikioPluginMissing],
1723ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_tabgroup_', 'hidden' => $mikioPluginMissing],
1724ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_tooltip_', 'hidden' => $mikioPluginMissing],
1725cee81679SJames Collins                ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'],
1726f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__darkmode_text_'],
1727f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__darkmode_code_'],
1728f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__darkmode_control_'],
1729f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__darkmode_topheader_'],
1730f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar_'],
1731f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar_'],
1732f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color_'],
1733f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb_'],
1734f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__darkmode_hero_'],
1735f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar_'],
1736f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__darkmode_content_'],
1737f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__darkmode_toc_'],
1738f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools_'],
1739f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__darkmode_footer_'],
1740f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__darkmode_table_'],
1741f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown_'],
1742f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit_'],
1743f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__darkmode_tree_'],
1744f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__darkmode_tab_'],
1745ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin (Dark mode)', 'starts_with' => '__plugin_darkmode_', 'heading' => 'h2',
17469ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17479ffe9161Snomadjimbob                ],
1748ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_darkmode_primary_',
17499ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17509ffe9161Snomadjimbob                ],
1751ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_darkmode_secondary_',
17529ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17539ffe9161Snomadjimbob                ],
1754ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_darkmode_success_',
17559ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17569ffe9161Snomadjimbob                ],
1757ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_darkmode_danger_',
17589ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17599ffe9161Snomadjimbob                ],
1760ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_darkmode_warning_',
17619ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17629ffe9161Snomadjimbob                ],
1763ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_darkmode_info_',
17649ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17659ffe9161Snomadjimbob                ],
1766ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_darkmode_light_',
17679ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17689ffe9161Snomadjimbob                ],
1769ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_darkmode_dark_',
17709ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17719ffe9161Snomadjimbob                ],
1772ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_darkmode_link_',
17739ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17749ffe9161Snomadjimbob                ],
1775ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_darkmode_carousel_',
17769ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17779ffe9161Snomadjimbob                ],
1778ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_darkmode_steps_', 'hidden' => $mikioPluginMissing],
1779ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_darkmode_tabgroup_',
17809ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
17819ffe9161Snomadjimbob                ],
1782ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_darkmode_tooltip_', 'hidden' => $mikioPluginMissing],
1783cee81679SJames Collins            ];
1784cee81679SJames Collins
1785cee81679SJames Collins            foreach ($style_headers as $header) {
1786cee81679SJames Collins                if (array_key_exists('heading', $header) === false) {
1787cee81679SJames Collins                    $header['heading'] = 'h3';
1788cee81679SJames Collins                }
1789cee81679SJames Collins
1790ad182e6dSnomadjimbob                if (array_key_exists('hidden', $header) === false) {
1791ad182e6dSnomadjimbob                    $header['hidden'] = false;
1792ad182e6dSnomadjimbob                }
1793ad182e6dSnomadjimbob
17941244e3ceSJames Collins                $content = preg_replace(
1795f65a4e5eSJames Collins                    '/(<tr>\s*<td>\s*<label for="tpl__' . $header['starts_with'] . '.+?<\/tr>)/s',
17969ffe9161Snomadjimbob                    '</tbody></table><' . $header['heading'] . ' style="display:' .
17979ffe9161Snomadjimbob                    ($header['hidden'] === true ? 'none' : 'block') . '">' .
17989ffe9161Snomadjimbob                    $header['title'] . '</' . $header['heading'] . '>
1799ad182e6dSnomadjimbob                    <table style="display:' . ($header['hidden'] === true ? 'none' : 'table') . '"><tbody>$1',
18001244e3ceSJames Collins                    $content,
18011244e3ceSJames Collins                    1
18021244e3ceSJames Collins                );
1803cee81679SJames Collins            }
1804f65a4e5eSJames Collins
1805f65a4e5eSJames Collins            $content = preg_replace('/type="color"/', 'type="text"', $content);
1806bb5a3dd1SJames Collins        }//end if
1807ab45ba71SJames Collins
18083a385f2cSJames Collins        if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
1809a8eebd82SJames Collins            $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content);
1810a8eebd82SJames Collins        }
1811ab45ba71SJames Collins
1812a8eebd82SJames Collins        // Page Revisions - Table Fix
18139cff245bSJames Collins        if (strpos($content, 'id="page__revisions"') !== false) {
18149cff245bSJames Collins            $content = preg_replace(
18159cff245bSJames Collins                '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/',
18169cff245bSJames Collins                '<span>$1</span>',
18179cff245bSJames Collins                $content
18189cff245bSJames Collins            );
1819a8eebd82SJames Collins        }
1820ab45ba71SJames Collins
18219cff245bSJames Collins        $html = new \simple_html_dom();
1822bc1032d9SJames Collins        $html->stripRNAttrValues = false;
1823c165b184SJames Collins        $html->load($content, true, false);
1824c165b184SJames Collins
18259cff245bSJames Collins        if ($html === false) {
18269cff245bSJames Collins            return $content;
18279cff245bSJames Collins        }
1828ab45ba71SJames Collins
1829ab45ba71SJames Collins        /* Buttons */
1830ab45ba71SJames Collins        foreach ($html->find('#config__manager button') as $node) {
1831ab45ba71SJames Collins            $c = explode(' ', $node->class);
18329cff245bSJames Collins            if (in_array('mikio-button', $c) === false) {
18339cff245bSJames Collins                $c[] = 'mikio-button';
18349cff245bSJames Collins            }
1835ab45ba71SJames Collins            $node->class = implode(' ', $c);
1836c165b184SJames Collins        }
1837c165b184SJames Collins
1838ab45ba71SJames Collins
1839ab45ba71SJames Collins        /* Buttons - Primary */
1840ab45ba71SJames Collins        foreach ($html->find('#config__manager [type=submit]') as $node) {
1841ab45ba71SJames Collins            $c = explode(' ', $node->class);
18429cff245bSJames Collins            if (in_array('mikio-primary', $c) === false) {
18439cff245bSJames Collins                $c[] = 'mikio-primary';
18449cff245bSJames Collins            }
1845ab45ba71SJames Collins            $node->class = implode(' ', $c);
1846ab45ba71SJames Collins        }
1847ab45ba71SJames Collins
1848a8eebd82SJames Collins        /* Hide page title if hero is enabled */
18499cff245bSJames Collins        if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
18501785fc73SJames Collins            $pageTitle = $this->parsePageTitle();
185147161538SJames Collins
185247161538SJames Collins            foreach ($html->find('h1,h2,h3,h4') as $elm) {
18539cff245bSJames Collins                if ($elm->innertext === $pageTitle) {
1854a8eebd82SJames Collins                    // $elm->innertext = '';
1855a8eebd82SJames Collins                    $elm->setAttribute('style', 'display:none');
1856a8eebd82SJames Collins
185747161538SJames Collins                    break;
185847161538SJames Collins                }
185947161538SJames Collins            }
186047161538SJames Collins        }
1861c165b184SJames Collins
1862a8eebd82SJames Collins        /* Hero subtitle */
18632b4583abSJames Collins        foreach ($html->find('p') as $elm) {
1864d0d6c450SJames Collins            if (preg_match('/[~-]~hero-subtitle (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1865d0d6c450SJames Collins                $subtitle = $matches[1];
1866a8eebd82SJames Collins                $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
1867a8eebd82SJames Collins
1868d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-subtitle (.+?)~[~-]/ui', '', $elm->innertext);
18692b4583abSJames Collins                break;
18702b4583abSJames Collins            }
18712b4583abSJames Collins        }
18722b4583abSJames Collins
1873a8eebd82SJames Collins        /* Hero image */
1874a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1875a8eebd82SJames Collins            $image = '';
1876d0d6c450SJames Collins            preg_match('/[~-]~hero-image (.+?)~[~-](?!.?")/ui', $elm->innertext, $matches);
1877a8eebd82SJames Collins            if (count($matches) > 0) {
1878a8eebd82SJames Collins                preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches);
1879a8eebd82SJames Collins                if (count($imageTagMatches) > 0) {
1880a8eebd82SJames Collins                    $image = $imageTagMatches[1];
1881a8eebd82SJames Collins                } else {
1882a8eebd82SJames Collins                    preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches);
1883a8eebd82SJames Collins                    if (count($imageTagMatches) > 0) {
1884a8eebd82SJames Collins                        $image = $imageTagMatches[1];
1885a8eebd82SJames Collins                    } else {
1886a8eebd82SJames Collins                        $image = strip_tags($matches[1]);
18879cff245bSJames Collins                        if (stripos($image, ':') === false) {
18889cff245bSJames Collins                            $image = str_replace(['{', '}'], '', $image);
1889a8eebd82SJames Collins                            $i = stripos($image, '?');
18909cff245bSJames Collins                            if ($i !== false) {
1891a8eebd82SJames Collins                                $image = substr($image, 0, $i);
1892c165b184SJames Collins                            }
1893c165b184SJames Collins
1894a8eebd82SJames Collins                            $image = ml($image, '', true, '', false);
1895ab45ba71SJames Collins                        }
1896ab45ba71SJames Collins                    }
1897ab45ba71SJames Collins                }
1898ab45ba71SJames Collins
1899a8eebd82SJames Collins                $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
1900a8eebd82SJames Collins
1901d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-image (.+?)~[~-].*/ui', '', $elm->innertext);
19029cff245bSJames Collins            }//end if
19039cff245bSJames Collins        }//end foreach
1904ab45ba71SJames Collins
19059cff245bSJames Collins        /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
19069cff245bSJames Collins        [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
1907a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1908d0d6c450SJames Collins            if (preg_match('/[~-]~hero-colors (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1909d0d6c450SJames Collins                $subtitle = $matches[1];
1910d0d6c450SJames Collins                $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $subtitle . '\')';
1911ab45ba71SJames Collins
1912d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-colors (.+?)~[~-]/ui', '', $elm->innertext);
1913a8eebd82SJames Collins                break;
1914ab45ba71SJames Collins            }
1915ab45ba71SJames Collins        }
1916ab45ba71SJames Collins
191796ec8e1eSJames Collins        /* Hide parts - ~~hide-parts [parts]~~  */
191896ec8e1eSJames Collins        foreach ($html->find('p') as $elm) {
1919*3a44a74aSJames Collins            if (preg_match('/[~-]~hide-parts (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1920d0d6c450SJames Collins                $parts = explode(' ', $matches[1]);
192196ec8e1eSJames Collins                $script = '';
192296ec8e1eSJames Collins
192396ec8e1eSJames Collins                foreach ($parts as $part) {
192496ec8e1eSJames Collins                    if (strlen($part) > 0) {
192596ec8e1eSJames Collins                        $script .= 'mikio.hidePart(\'' . $part . '\');';
192696ec8e1eSJames Collins                    }
192796ec8e1eSJames Collins                }
192896ec8e1eSJames Collins
192996ec8e1eSJames Collins                if (strlen($script) > 0) {
193096ec8e1eSJames Collins                    $this->footerScript['hide-parts'] = $script;
193196ec8e1eSJames Collins                }
193296ec8e1eSJames Collins
1933*3a44a74aSJames Collins                $elm->innertext = preg_replace('/[~-]~hide-parts (.+?)~[~-]/ui', '', $elm->innertext);
193496ec8e1eSJames Collins                break;
1935d0d6c450SJames Collins            }
19369cff245bSJames Collins        }//end foreach
193796ec8e1eSJames Collins
193896ec8e1eSJames Collins
1939a8eebd82SJames Collins        /* Page Tags (tag plugin) */
19409cff245bSJames Collins        if ($this->getConf('tagsConsolidate') === true) {
1941a8eebd82SJames Collins            $tags = '';
1942a8eebd82SJames Collins            foreach ($html->find('div.tags a') as $elm) {
1943a8eebd82SJames Collins                $tags .= $elm->outertext;
1944a8eebd82SJames Collins            }
1945a8eebd82SJames Collins
1946a8eebd82SJames Collins            foreach ($html->find('div.tags') as $elm) {
1947a8eebd82SJames Collins                $elm->innertext = '';
1948a8eebd82SJames Collins                $elm->setAttribute('style', 'display:none');
1949a8eebd82SJames Collins            }
1950a8eebd82SJames Collins
19513a385f2cSJames Collins            if (empty($tags) === false) {
1952a8eebd82SJames Collins                $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
1953a8eebd82SJames Collins            }
1954ab45ba71SJames Collins        }
1955ab45ba71SJames Collins
1956ab45ba71SJames Collins        // Configuration Manager
19573a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
1958ab45ba71SJames Collins            // Additional save buttons
1959ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
1960ab45ba71SJames Collins                $saveButtons = '';
1961ab45ba71SJames Collins
1962ab45ba71SJames Collins                foreach ($cm->find('p') as $elm) {
1963ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
1964a8eebd82SJames Collins                    $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons);
1965ab45ba71SJames Collins                    $elm->outertext = '';
1966ab45ba71SJames Collins                }
1967ab45ba71SJames Collins
1968ab45ba71SJames Collins                foreach ($cm->find('fieldset') as $elm) {
1969ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
1970ab45ba71SJames Collins                }
1971ab45ba71SJames Collins            }
1972ab45ba71SJames Collins        }
1973ab45ba71SJames Collins
1974ab45ba71SJames Collins        $content = $html->save();
1975c165b184SJames Collins        $html->clear();
1976c165b184SJames Collins        unset($html);
1977c165b184SJames Collins
1978c165b184SJames Collins        return $content;
1979c165b184SJames Collins    }
19802b4583abSJames Collins
19812b4583abSJames Collins
1982a8eebd82SJames Collins    /**
1983a8eebd82SJames Collins     * Get DokuWiki namespace/page/URI as link
1984a8eebd82SJames Collins     *
19859cff245bSJames Collins     * @param   string $str String to parse.
19869cff245bSJames Collins     * @return  string      parsed URI
1987a8eebd82SJames Collins     */
19889cff245bSJames Collins    public function getLink(string $str)
198910b40067Snomadjimbob    {
19902b4583abSJames Collins        $i = strpos($str, '://');
19919cff245bSJames Collins        if ($i !== false) {
19929cff245bSJames Collins            return $str;
19939cff245bSJames Collins        }
19942b4583abSJames Collins
19952b4583abSJames Collins        return wl($str);
19962b4583abSJames Collins    }
1997ab45ba71SJames Collins
1998ab45ba71SJames Collins
1999a8eebd82SJames Collins    /**
2000a8eebd82SJames Collins     * Check if the user can edit current namespace/page
2001a8eebd82SJames Collins     *
2002a8eebd82SJames Collins     * @return  boolean  user can edit
2003a8eebd82SJames Collins     */
200410b40067Snomadjimbob    public function userCanEdit()
200510b40067Snomadjimbob    {
2006ab45ba71SJames Collins        global $INFO;
2007ab45ba71SJames Collins        global $ID;
2008ab45ba71SJames Collins
2009ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
20109cff245bSJames Collins        if (@file_exists($wiki_file) === false) {
20119cff245bSJames Collins            return true;
20129cff245bSJames Collins        }
20139cff245bSJames Collins        if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
20149cff245bSJames Collins            return true;
20159cff245bSJames Collins        }
2016a8eebd82SJames Collins        // $meta_file = metaFN($ID, '.meta');
20179cff245bSJames Collins        if ($INFO['meta']['user'] === false) {
20189cff245bSJames Collins            return true;
20199cff245bSJames Collins        }
20209cff245bSJames Collins        if ($INFO['client'] === $INFO['meta']['user']) {
20219cff245bSJames Collins            return true;
20229cff245bSJames Collins        }
2023ab45ba71SJames Collins
2024ab45ba71SJames Collins        return false;
2025c165b184SJames Collins    }
202647161538SJames Collins
202747161538SJames Collins
2028a8eebd82SJames Collins    /**
2029a8eebd82SJames Collins     * Search for and return the uri of a media file
2030a8eebd82SJames Collins     *
20319cff245bSJames Collins     * @param string  $image           Image name to search for (without extension).
20329cff245bSJames Collins     * @param boolean $searchCurrentNS Search the current namespace.
20339cff245bSJames Collins     * @param boolean $propagate       Propagate search through the namespace.
20349cff245bSJames Collins     * @return string                  URI of the found media file
2035a8eebd82SJames Collins     */
20369cff245bSJames Collins    public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
203710b40067Snomadjimbob    {
2038ab45ba71SJames Collins        global $INFO;
2039a8eebd82SJames Collins
20409cff245bSJames Collins        $ext = ['png', 'jpg', 'gif', 'svg'];
2041ab45ba71SJames Collins
20429cff245bSJames Collins        if ($searchCurrentNS === true) {
20439cff245bSJames Collins            $prefix[] = ':' . $INFO['namespace'] . ':';
20449cff245bSJames Collins        }
20459cff245bSJames Collins        if ($propagate === true) {
2046ab45ba71SJames Collins            $prefix[] = ':';
2047ab45ba71SJames Collins            $prefix[] = ':wiki:';
2048a8eebd82SJames Collins        }
2049ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
20503a385f2cSJames Collins        if (empty($theme) === false) {
20519cff245bSJames Collins            $prefix[] = 'themes/' . $theme . '/images/';
20529cff245bSJames Collins        }
2053ab45ba71SJames Collins        $prefix[] = 'images/';
2054ab45ba71SJames Collins
20559cff245bSJames Collins        $search = [];
2056ab45ba71SJames Collins        foreach ($prefix as $pitem) {
2057ab45ba71SJames Collins            foreach ($ext as $eitem) {
2058ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
2059ab45ba71SJames Collins            }
2060ab45ba71SJames Collins        }
2061ab45ba71SJames Collins
2062ab45ba71SJames Collins        $img = '';
2063ab45ba71SJames Collins        $file = '';
2064ab45ba71SJames Collins        $url = '';
2065ab45ba71SJames Collins        $ismedia = false;
2066ab45ba71SJames Collins        $found = false;
2067ab45ba71SJames Collins
2068ab45ba71SJames Collins        foreach ($search as $img) {
20693a385f2cSJames Collins            if (strcasecmp(substr($img, 0, 1), ':') === 0) {
2070ab45ba71SJames Collins                $file    = mediaFN($img);
2071ab45ba71SJames Collins                $ismedia = true;
2072ab45ba71SJames Collins            } else {
2073ab45ba71SJames Collins                $file    = tpl_incdir() . $img;
2074ab45ba71SJames Collins                $ismedia = false;
2075ab45ba71SJames Collins            }
2076ab45ba71SJames Collins
20779cff245bSJames Collins            if (file_exists($file) === true) {
2078ab45ba71SJames Collins                $found = true;
2079ab45ba71SJames Collins                break;
2080ab45ba71SJames Collins            }
2081ab45ba71SJames Collins        }
2082ab45ba71SJames Collins
20839cff245bSJames Collins        if ($found === false) {
20849cff245bSJames Collins            return false;
20859cff245bSJames Collins        }
2086ab45ba71SJames Collins
20879cff245bSJames Collins        if ($ismedia === true) {
2088ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
2089ab45ba71SJames Collins        } else {
2090ab45ba71SJames Collins            $url = tpl_basedir() . $img;
2091ab45ba71SJames Collins        }
2092ab45ba71SJames Collins
2093ab45ba71SJames Collins        return $url;
2094ab45ba71SJames Collins    }
2095ab45ba71SJames Collins
2096a8eebd82SJames Collins
2097a8eebd82SJames Collins    /**
2098ab45ba71SJames Collins     * Print or return the page title
2099ab45ba71SJames Collins     *
21009cff245bSJames Collins     * @param string $page Page id or empty string for current page.
2101ab45ba71SJames Collins     * @return string      generated content
2102ab45ba71SJames Collins     */
21039cff245bSJames Collins    public function getPageTitle(string $page = '')
210410b40067Snomadjimbob    {
2105ab45ba71SJames Collins        global $ID, $conf;
2106ab45ba71SJames Collins
2107ab45ba71SJames Collins        $html = '';
2108ab45ba71SJames Collins
21093a385f2cSJames Collins        if (empty($page) === true) {
21109cff245bSJames Collins            $page = $ID;
21119cff245bSJames Collins        }
2112ab45ba71SJames Collins
2113ab45ba71SJames Collins        $html = p_get_first_heading($page);
2114ab45ba71SJames Collins        $html = strip_tags($html);
2115ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
2116ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
2117ab45ba71SJames Collins        $html = trim($html);
2118ab45ba71SJames Collins
2119ab45ba71SJames Collins        return $html;
2120ab45ba71SJames Collins    }
2121a8eebd82SJames Collins
2122a8eebd82SJames Collins
2123a8eebd82SJames Collins    /**
2124a8eebd82SJames Collins     * Return inline theme icon
2125a8eebd82SJames Collins     *
21269cff245bSJames Collins     * @param   string $type  Icon to retreive.
21279e41d878SJames Collins     * @param   string $class Classname to insert.
21289cff245bSJames Collins     * @return  string        HTML icon content
2129a8eebd82SJames Collins     */
21309e41d878SJames Collins    public function mikioInlineIcon(string $type, string $class = "")
213110b40067Snomadjimbob    {
21329e41d878SJames Collins        if (is_array($class) === true) {
21339e41d878SJames Collins            $class = explode(' ', $class);
21349e41d878SJames Collins        }
21359e41d878SJames Collins
21369e41d878SJames Collins        if (strlen($class) > 0) {
21379e41d878SJames Collins            $class = ' ' . $class;
21389e41d878SJames Collins        }
21399e41d878SJames Collins
2140a8eebd82SJames Collins        switch ($type) {
2141a8eebd82SJames Collins            case 'wrench':
2142906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792
2143906e1a13SJames 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,
2144906e1a13SJames 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,
2145906e1a13SJames 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,
2146906e1a13SJames 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
2147906e1a13SJames 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,
2148906e1a13SJames 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>';
2149a8eebd82SJames Collins            case 'file':
2150906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2151906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991">
2152906e1a13SJames 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
2153906e1a13SJames 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
2154906e1a13SJames 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"
21559cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
2156a8eebd82SJames Collins            case 'gear':
2157906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2158906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027">
2159906e1a13SJames 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
2160906e1a13SJames 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
2161906e1a13SJames 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
2162906e1a13SJames 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
2163906e1a13SJames 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
2164906e1a13SJames 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,
2165906e1a13SJames 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
2166906e1a13SJames 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
2167906e1a13SJames 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" />
2168906e1a13SJames Collins</g></svg>';
2169a8eebd82SJames Collins            case 'user':
2170906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2171906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M
2172906e1a13SJames 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
2173906e1a13SJames 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,
2174906e1a13SJames 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
2175906e1a13SJames 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
2176906e1a13SJames 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,
2177906e1a13SJames Collins1408 863,1408 975.5,1295.5 1088,1183 1088,1024 z"/></g></svg>';
2178a8eebd82SJames Collins            case 'search':
21799e41d878SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
21809cff245bSJames 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
21819cff245bSJames 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
21829cff245bSJames 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
21839cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>';
2184a8eebd82SJames Collins            case 'home':
2185906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2186906e1a13SJames CollinsviewBox="0 -256 1792 1792" aria-hidden="true" style="fill:currentColor"><g
2187906e1a13SJames 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
2188906e1a13SJames 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
2189906e1a13SJames 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
2190906e1a13SJames 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,
2191906e1a13SJames 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"
21929cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
21939e41d878SJames Collins            case 'sun':
2194906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2195906e1a13SJames 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
2196906e1a13SJames 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
2197906e1a13SJames 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
2198906e1a13SJames 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
2199906e1a13SJames Collins0 0 1-.707.707z" /></svg>';
22009e41d878SJames Collins            case 'moon':
2201906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2202906e1a13SJames 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
2203906e1a13SJames 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
2204906e1a13SJames 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
2205906e1a13SJames 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
2206906e1a13SJames Collins0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>';
220734d5f19aSJames Collins            case 'sunmoon':
2208d0fba6d1SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2209d0fba6d1SJames Collinsstyle="fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
2210d0fba6d1SJames CollinsviewBox="0 0 32 32"><line x1="16" y1="3" x2="16" y2="29"/><path d="M16,23c-3.87,0-7-3.13-7-7s3.13-7,7-7"/><line
2211d0fba6d1SJames Collinsx1="6.81" y1="6.81" x2="8.93" y2="8.93"/><line x1="3" y1="16" x2="6" y2="16"/><line x1="6.81" y1="25.19" x2="8.93"
2212d0fba6d1SJames Collinsy2="23.07"/><path d="M16,12.55C17.2,10.43,19.48,9,22.09,9c0.16,0,0.31,0.01,0.47,0.02c-1.67,0.88-2.8,2.63-2.8,4.64c0,2.9,
2213d0fba6d1SJames Collins2.35,5.25,5.25,5.25c1.6,0,3.03-0.72,3.99-1.85C28.48,20.43,25.59,23,22.09,23c-2.61,0-4.89-1.43-6.09-3.55"/></svg>';
2214f65a4e5eSJames Collins            case 'hamburger':
2215f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
2216f65a4e5eSJames 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
2217f65a4e5eSJames 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
2218f65a4e5eSJames 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
2219f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16z"/></svg>';
2220f65a4e5eSJames Collins            case 'down-arrow':
2221f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
2222f65a4e5eSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M16.003 18.626l7.081-7.081L25 13.46l-8.997 8.998-9.003-9
2223f65a4e5eSJames Collins1.917-1.916z"/></svg>';
22243a3ece10SJames Collins            case 'language':
22253a3ece10SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" width="16"
22263a3ece10SJames Collinsheight="16" fill="currentColor" viewBox="0 0 16 16"><path d="M4.545 6.714 4.11
22273a3ece10SJames Collins8H3l1.862-5h1.284L8 8H6.833l-.435-1.286H4.545zm1.634-.736L5.5 3.956h-.049l-.679 2.022H6.18z"/><path d="M0 2a2 2 0 0 1
22283a3ece10SJames Collins2-2h7a2 2 0 0 1 2 2v3h3a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2v-3H2a2 2 0 0 1-2-2V2zm2-1a1 1 0 0 0-1 1v7a1 1 0 0
22293a3ece10SJames Collins0 1 1h7a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H2zm7.138 9.995c.193.301.402.583.63.846-.748.575-1.673 1.001-2.768
22303a3ece10SJames Collins1.292.178.217.451.635.555.867 1.125-.359 2.08-.844 2.886-1.494.777.665 1.739 1.165 2.93
22313a3ece10SJames Collins1.472.133-.254.414-.673.629-.89-1.125-.253-2.057-.694-2.82-1.284.681-.747 1.222-1.651
22323a3ece10SJames Collins1.621-2.757H14V8h-3v1.047h.765c-.318.844-.74 1.546-1.272 2.13a6.066 6.066 0 0 1-.415-.492 1.988 1.988 0 0 1-.94.31z"/>
22333a3ece10SJames Collins</svg>';
22349cff245bSJames Collins        }//end switch
2235ab45ba71SJames Collins
2236a8eebd82SJames Collins        return '';
2237a8eebd82SJames Collins    }
2238ab45ba71SJames Collins
2239a8eebd82SJames Collins    /**
2240a8eebd82SJames Collins     * Finalize theme
22419cff245bSJames Collins     *
22429cff245bSJames Collins     * @return void
2243a8eebd82SJames Collins     */
224410b40067Snomadjimbob    public function finalize()
224510b40067Snomadjimbob    {
2246a8eebd82SJames Collins    }
22471785fc73SJames Collins
22481785fc73SJames Collins    /**
22491785fc73SJames Collins     * Show Messages
22509cff245bSJames Collins     *
22519cff245bSJames Collins     * @return void
22521785fc73SJames Collins     */
225310b40067Snomadjimbob    public function showMessages()
225410b40067Snomadjimbob    {
22551785fc73SJames Collins        global $ACT;
22561785fc73SJames Collins
22579cff245bSJames Collins        if ($this->lessIgnored === true) {
22589cff245bSJames Collins            msg(
22599cff245bSJames Collins                'useLESS is enabled on the Mikio template, however is not supported on this server',
22609cff245bSJames Collins                2,
22619cff245bSJames Collins                '',
22629cff245bSJames Collins                '',
22639cff245bSJames Collins                MSG_ADMINS_ONLY
22649cff245bSJames Collins            );
2265a8df40efSJames Collins        }
2266a8df40efSJames Collins
22671785fc73SJames Collins        $show = $this->getConf('showNotifications');
22683a385f2cSJames Collins        if (
22694f8225e4SJames Collins            strlen($show) === 0 ||
22703a385f2cSJames Collins            strcasecmp($show, 'always') === 0 ||
22713a385f2cSJames Collins            (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
22723a385f2cSJames Collins        ) {
22731785fc73SJames Collins            global $MSG, $MSG_shown;
22741785fc73SJames Collins
22754f8225e4SJames Collins            if (isset($MSG) !== false) {
22769cff245bSJames Collins                if (isset($MSG_shown) === false) {
22779cff245bSJames Collins                    $MSG_shown = [];
2278a8df40efSJames Collins                }
22791785fc73SJames Collins
22801785fc73SJames Collins                foreach ($MSG as $msg) {
22811785fc73SJames Collins                    $hash = md5($msg['msg']);
22829cff245bSJames Collins                    if (isset($MSG_shown[$hash]) === true) {
22831785fc73SJames Collins                        continue;
22841785fc73SJames Collins                    }
22851785fc73SJames Collins                    // skip double messages
22861785fc73SJames Collins
22879cff245bSJames Collins                    if (info_msg_allowed($msg) === true) {
22889cff245bSJames Collins                        echo '<div class="' . $msg['lvl'] . '">';
22899cff245bSJames Collins                        echo $msg['msg'];
22909cff245bSJames Collins                        echo '</div>';
22911785fc73SJames Collins                    }
22921785fc73SJames Collins
2293a8df40efSJames Collins                    $MSG_shown[$hash] = true;
22941785fc73SJames Collins                }
22951785fc73SJames Collins
22961785fc73SJames Collins                unset($GLOBALS['MSG']);
22979cff245bSJames Collins            }//end if
22984f8225e4SJames Collins
22994f8225e4SJames Collins            if (strlen($this->includedPageNotifications) > 0) {
23004f8225e4SJames Collins                echo $this->includedPageNotifications;
23014f8225e4SJames Collins            }
23024f8225e4SJames Collins        }//end if
23031785fc73SJames Collins    }
23047ac0a6efSJames Collins
23057ac0a6efSJames Collins    /**
23067ac0a6efSJames Collins     * Dokuwiki version
23077ac0a6efSJames Collins     *
23087ac0a6efSJames Collins     * @return  string        the dw version name
23097ac0a6efSJames Collins     */
23109cff245bSJames Collins    public function dwVersion()
23119cff245bSJames Collins    {
23129cff245bSJames Collins        if (function_exists('getVersionData') === true) {
23137ac0a6efSJames Collins            $version_data = getVersionData();
23149cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
23157ac0a6efSJames Collins                $version_items = explode(' ', $version_data['date']);
23167ac0a6efSJames Collins                if (count($version_items) >= 2) {
23177ac0a6efSJames Collins                    return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
23187ac0a6efSJames Collins                }
23197ac0a6efSJames Collins            }
23207ac0a6efSJames Collins        }
23217ac0a6efSJames Collins
23227ac0a6efSJames Collins        return 'unknown';
23237ac0a6efSJames Collins    }
2324e4c4fb13SJames Collins
2325e4c4fb13SJames Collins    /**
2326e4c4fb13SJames Collins     * Dokuwiki version number
2327e4c4fb13SJames Collins     *
2328e4c4fb13SJames Collins     * @return  string        the dw version date converted to integer
2329e4c4fb13SJames Collins     */
23309cff245bSJames Collins    public function dwVersionNumber()
23319cff245bSJames Collins    {
23329cff245bSJames Collins        if (function_exists('getVersionData') === true) {
2333e4c4fb13SJames Collins            $version_data = getVersionData();
23349cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
2335e4c4fb13SJames Collins                $version_items = explode(' ', $version_data['date']);
2336e4c4fb13SJames Collins                if (count($version_items) >= 1) {
2337e4c4fb13SJames Collins                    return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
2338e4c4fb13SJames Collins                }
2339e4c4fb13SJames Collins            }
2340e4c4fb13SJames Collins        }
2341e4c4fb13SJames Collins
2342e4c4fb13SJames Collins        return 0;
2343e4c4fb13SJames Collins    }
2344a8eebd82SJames Collins}
2345ab45ba71SJames Collins
2346ab45ba71SJames Collinsglobal $TEMPLATE;
234747161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
2348