xref: /template/mikio/mikio.php (revision f65a4e5e3c2d75e8974ed118d41aebefcb28b167)
1c165b184SJames Collins<?php
210b40067Snomadjimbob
3c165b184SJames Collins/**
4c165b184SJames Collins * DokuWiki Mikio Template
5c165b184SJames Collins *
6c165b184SJames Collins * @link    http://dokuwiki.org/template:mikio
7c165b184SJames Collins * @author  James Collins <james.collins@outlook.com.au>
8ab45ba71SJames Collins * @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html)
9c165b184SJames Collins */
1010b40067Snomadjimbob
11ab45ba71SJames Collinsnamespace dokuwiki\template\mikio;
12c165b184SJames Collins
139cff245bSJames Collinsif (defined('DOKU_INC') === false) {
149cff245bSJames Collins    die();
159cff245bSJames Collins}
16c165b184SJames Collins
17ab45ba71SJames Collinsrequire_once('icons/icons.php');
18c165b184SJames Collinsrequire_once('inc/simple_html_dom.php');
19c165b184SJames Collins
2010b40067Snomadjimbobclass Template
2110b40067Snomadjimbob{
229cff245bSJames Collins    /**
239cff245bSJames Collins     * @var string Template directory path from local FS.
249cff245bSJames Collins     */
25c165b184SJames Collins    public $tplDir  = '';
269cff245bSJames Collins
279cff245bSJames Collins    /**
289cff245bSJames Collins     * @var string Template directory path from web.
299cff245bSJames Collins     */
30c165b184SJames Collins    public $baseDir = '';
319cff245bSJames Collins
329cff245bSJames Collins    /**
339cff245bSJames Collins     * @var array Array of Javascript files to include in footer.
349cff245bSJames Collins     */
359cff245bSJames Collins    public $footerScript = [];
369cff245bSJames Collins
379cff245bSJames Collins    /**
389cff245bSJames Collins     * @var boolean Ignore LESS files.
399cff245bSJames Collins     */
40a8df40efSJames Collins    public $lessIgnored = false;
41c165b184SJames Collins
42c165b184SJames Collins
43c165b184SJames Collins    /**
44c165b184SJames Collins     * Class constructor
45c165b184SJames Collins     */
4610b40067Snomadjimbob    public function __construct()
4710b40067Snomadjimbob    {
48c165b184SJames Collins        $this->tplDir  = tpl_incdir();
49c165b184SJames Collins        $this->baseDir = tpl_basedir();
50c165b184SJames Collins
519cff245bSJames Collins        $this->registerHooks();
52c165b184SJames Collins    }
53c165b184SJames Collins
54c165b184SJames Collins
55c165b184SJames Collins    /**
56ab45ba71SJames Collins     * Returns the instance of the class
5747161538SJames Collins     *
58ab45ba71SJames Collins     * @return  Template        class instance
5947161538SJames Collins     */
6047161538SJames Collins    public static function getInstance()
6147161538SJames Collins    {
6247161538SJames Collins        static $instance = null;
6347161538SJames Collins
643a385f2cSJames Collins        if (empty($instance) === true) {
6547161538SJames Collins            $instance = new Template();
6647161538SJames Collins        }
6747161538SJames Collins
6847161538SJames Collins        return $instance;
6947161538SJames Collins    }
7047161538SJames Collins
71ab45ba71SJames Collins
7247161538SJames Collins    /**
73ab45ba71SJames Collins     * Register the themes hooks into Dokuwiki
749cff245bSJames Collins     *
759cff245bSJames Collins     * @return void
76c165b184SJames Collins     */
779cff245bSJames Collins    private function registerHooks()
7810b40067Snomadjimbob    {
79c165b184SJames Collins        global $EVENT_HANDLER;
80c165b184SJames Collins
819cff245bSJames Collins        $events_dispatcher = [
82ab45ba71SJames Collins            'TPL_METAHEADER_OUTPUT'     => 'metaheadersHandler'
839cff245bSJames Collins        ];
84c165b184SJames Collins
85c165b184SJames Collins        foreach ($events_dispatcher as $event => $method) {
86c165b184SJames Collins            $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method);
87c165b184SJames Collins        }
88c165b184SJames Collins    }
89c165b184SJames Collins
90c165b184SJames Collins
91c165b184SJames Collins    /**
92ab45ba71SJames Collins     * Meta handler hook for DokuWiki
93c165b184SJames Collins     *
949cff245bSJames Collins     * @param   \Doku_Event $event DokuWiki Event.
959cff245bSJames Collins     * @return  void
96c165b184SJames Collins     */
9710b40067Snomadjimbob    public function metaHeadersHandler(\Doku_Event $event)
9810b40067Snomadjimbob    {
99ab45ba71SJames Collins        global $MIKIO_ICONS;
100b5536b07SChris MacMackin        global $conf;
101ab45ba71SJames Collins
1029cff245bSJames Collins        $this->includePage('theme', false, true);
103a8eebd82SJames Collins
1049cff245bSJames Collins        $stylesheets    = [];
1059cff245bSJames Collins        $scripts        = [];
106c165b184SJames Collins
1073a385f2cSJames Collins        if (empty($this->getConf('customTheme')) === false) {
1089cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) {
109a8eebd82SJames Collins                $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less';
110a8eebd82SJames Collins            } else {
1119cff245bSJames Collins                if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) {
112ab45ba71SJames Collins                    $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css';
1132b4583abSJames Collins                }
114a8eebd82SJames Collins            }
1159cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) {
116ab45ba71SJames Collins                $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js';
117c165b184SJames Collins            }
118c165b184SJames Collins        }
119c165b184SJames Collins
1203a385f2cSJames Collins        if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) {
1219cff245bSJames Collins            $icons = [];
122ab45ba71SJames Collins            foreach ($MIKIO_ICONS as $icon) {
1239cff245bSJames Collins                if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) {
124ab45ba71SJames Collins                    $icons[] = $icon;
125c165b184SJames Collins
1263a385f2cSJames Collins                    if (empty($icon['css']) === false) {
1279cff245bSJames Collins                        if (strpos($icon['css'], '//') === false) {
128a8eebd82SJames Collins                            $stylesheets[] = $this->baseDir . 'icons/' . $icon['css'];
129ab45ba71SJames Collins                        } else {
130a8eebd82SJames Collins                            $stylesheets[] = $icon['css'];
131ab45ba71SJames Collins                        }
132ab45ba71SJames Collins                    }
133ab45ba71SJames Collins                }
134ab45ba71SJames Collins            }
135ab45ba71SJames Collins            $MIKIO_ICONS = $icons;
136ab45ba71SJames Collins        } else {
137ab45ba71SJames Collins            $MIKIO_ICONS = [];
138ab45ba71SJames Collins        }
139c165b184SJames Collins
1407864545bSChris MacMackin        $scripts[] = $this->baseDir . 'assets/mikio-typeahead.js';
141ab45ba71SJames Collins        $scripts[] = $this->baseDir . 'assets/mikio.js';
142644fd9f9SJames Collins
1439cff245bSJames Collins        if ($this->getConf('useLESS') === true) {
144ab45ba71SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.less';
145644fd9f9SJames Collins        } else {
146644fd9f9SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.css';
147644fd9f9SJames Collins        }
148644fd9f9SJames Collins
149ab45ba71SJames Collins
150ab45ba71SJames Collins        $set = [];
151c165b184SJames Collins        foreach ($stylesheets as $style) {
1529cff245bSJames Collins            if (in_array($style, $set) === false) {
1533a385f2cSJames Collins                if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) {
154ab45ba71SJames Collins                    $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style);
155ab45ba71SJames Collins                }
156ab45ba71SJames Collins
1579cff245bSJames Collins                array_unshift($event->data['link'], [
158c165b184SJames Collins                    'type' => 'text/css',
159c165b184SJames Collins                    'rel'  => 'stylesheet',
160c165b184SJames Collins                    'href' => $style
1619cff245bSJames Collins                ]);
162c165b184SJames Collins            }
163ab45ba71SJames Collins            $set[] = $style;
164ab45ba71SJames Collins        }
165c165b184SJames Collins
166ab45ba71SJames Collins        $set = [];
167c165b184SJames Collins        foreach ($scripts as $script) {
1689cff245bSJames Collins            if (in_array($script, $set) === false) {
1699cff245bSJames Collins                $script_params = [
170c165b184SJames Collins                    'type'  => 'text/javascript',
171c165b184SJames Collins                    '_data' => '',
1728395cdcbSChris MacMackin                    'src'   => $script
1739cff245bSJames Collins                ];
174c1ecb866SJames Collins
175c1ecb866SJames Collins                // equal to or greator than hogfather
176c1ecb866SJames Collins                if ($this->dwVersionNumber() >= 20200729) {
177c1ecb866SJames Collins                    // greator than hogfather - defer always on
178c1ecb866SJames Collins                    if ($this->dwVersionNumber() >= 20200729) {
179c1ecb866SJames Collins                        $script_params += ['defer' => 'defer'];
180c1ecb866SJames Collins                    } else {
181c1ecb866SJames Collins                        // hogfather - defer always on unless $conf['defer_js'] is false
1829cff245bSJames Collins                        if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) {
1838395cdcbSChris MacMackin                            $script_params += ['defer' => 'defer'];
1848395cdcbSChris MacMackin                        }
185c1ecb866SJames Collins                    }
186c1ecb866SJames Collins                }
187c1ecb866SJames Collins
1888395cdcbSChris MacMackin                $event->data['script'][] = $script_params;
1899cff245bSJames Collins            }//end if
190ab45ba71SJames Collins            $set[] = $script;
1919cff245bSJames Collins        }//end foreach
192c165b184SJames Collins    }
193c165b184SJames Collins
194c165b184SJames Collins
195c165b184SJames Collins    /**
196a8eebd82SJames Collins     * Print or return the footer meta data
197c165b184SJames Collins     *
1989cff245bSJames Collins     * @param   boolean $print Print the data to buffer.
1999cff245bSJames Collins     * @return  string         HTML footer meta data
200c165b184SJames Collins     */
2019cff245bSJames Collins    public function includeFooterMeta(bool $print = true)
20210b40067Snomadjimbob    {
203a8eebd82SJames Collins        $html = '';
204a8eebd82SJames Collins
205a8eebd82SJames Collins        if (count($this->footerScript) > 0) {
206a8eebd82SJames Collins            $html .= '<script type="text/javascript">function mikioFooterRun() {';
207a8eebd82SJames Collins            foreach ($this->footerScript as $script) {
208a8eebd82SJames Collins                $html .= $script . ';';
209a8eebd82SJames Collins            }
210a8eebd82SJames Collins            $html .= '}</script>';
211a8eebd82SJames Collins        }
212c165b184SJames Collins
213c165b184SJames Collins
2149cff245bSJames Collins        if ($print === true) {
2159cff245bSJames Collins            echo $html;
2169cff245bSJames Collins        }
217a8eebd82SJames Collins        return $html;
218a8eebd82SJames Collins    }
219a8eebd82SJames Collins
22095372bffSJames Collins
22195372bffSJames Collins    // phpcs:disable Squiz.Commenting.FunctionComment.TypeHintMissing
22295372bffSJames Collins
22395372bffSJames Collins
224a8eebd82SJames Collins    /**
225ab45ba71SJames Collins     * Retreive and parse theme configuration options
226c165b184SJames Collins     *
2279cff245bSJames Collins     * @param   string $key     The configuration key to retreive.
2289cff245bSJames Collins     * @param   mixed  $default If key doesn't exist, return this value.
229ab45ba71SJames Collins     * @return  mixed           parsed value of configuration
230c165b184SJames Collins     */
23195372bffSJames Collins    public function getConf(string $key, $default = false)
23210b40067Snomadjimbob    {
233c165b184SJames Collins        $value = tpl_getConf($key, $default);
234c165b184SJames Collins
2353a385f2cSJames Collins        $data = [
2363a385f2cSJames Collins            ['keys' => ['navbarDWMenuType'],                'type' => 'choice',
2373a385f2cSJames Collins                'values' => ['both', 'icons', 'text']
2383a385f2cSJames Collins            ],
2393a385f2cSJames Collins            ['keys' => ['navbarDWMenuCombine'],             'type' => 'choice',
2403a385f2cSJames Collins                'values' => ['combine', 'seperate', 'dropdown']
2413a385f2cSJames Collins            ],
2423a385f2cSJames Collins            ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'],
2433a385f2cSJames Collins                'type' => 'choice',
2443a385f2cSJames Collins                'values' => ['none', 'custom', 'search', 'dokuwiki'],
2453a385f2cSJames Collins                'default' => [
2463a385f2cSJames Collins                    'navbarPosLeft' => 'none',
2473a385f2cSJames Collins                    'navbarPosMiddle' => 'search',
2483a385f2cSJames Collins                    'navbarPosRight' => 'dokuwiki'
2493a385f2cSJames Collins                ]
2503a385f2cSJames Collins            ],
2513a385f2cSJames Collins            ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink',
2523a385f2cSJames Collins                'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile',
2533a385f2cSJames Collins                'navbarItemShowAdmin'
2543a385f2cSJames Collins            ],
2553a385f2cSJames Collins                'type' => 'choice',
2563a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
2573a385f2cSJames Collins            ],
2583a385f2cSJames Collins            ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'],
2593a385f2cSJames Collins                'type' => 'choice',
2603a385f2cSJames Collins                'values' => ['always', 'never']
2613a385f2cSJames Collins            ],
2623a385f2cSJames Collins            ['keys' => ['searchButton'],                    'type' => 'choice',
2633a385f2cSJames Collins                'values' => ['icon', 'text']
2643a385f2cSJames Collins            ],
2653a385f2cSJames Collins            ['keys' => ['breadcrumbPosition', 'youareherePosition'],
2663a385f2cSJames Collins                'type' => 'choice',
2673a385f2cSJames Collins                'values' => ['top', 'hero', 'page', 'none']
2683a385f2cSJames Collins            ],
2693a385f2cSJames Collins            ['keys' => ['youarehereHome'],                  'type' => 'choice',
2703a385f2cSJames Collins                'values' => ['page title', 'home', 'icon', 'none']
2713a385f2cSJames Collins            ],
2723a385f2cSJames Collins            ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'],
2733a385f2cSJames Collins                'type' => 'choice',
2743a385f2cSJames Collins                'values' => ['none', 'logged in user', 'search', 'content', 'tags'],
2753a385f2cSJames Collins                'default' => [
2763a385f2cSJames Collins                    'sidebarLeftRow1' => 'logged in user',
2773a385f2cSJames Collins                    'sidebarLeftRow2' => 'search',
2783a385f2cSJames Collins                    'sidebarLeftRow3' => 'content'
2793a385f2cSJames Collins                ]
2803a385f2cSJames Collins            ],
2813a385f2cSJames Collins            ['keys' => ['pageToolsFloating', 'pageToolsFooter'],
2823a385f2cSJames Collins                'type' => 'choice',
2833a385f2cSJames Collins                'values' => ['always', 'none', 'page editors']
2843a385f2cSJames Collins            ],
2853a385f2cSJames Collins            ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink',
2863a385f2cSJames Collins                'pageToolsShowTop'
2873a385f2cSJames Collins            ],
2883a385f2cSJames Collins                'type' => 'choice',
2893a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
2903a385f2cSJames Collins            ],
2913a385f2cSJames Collins            ['keys' => ['showNotifications'],               'type' => 'choice',
2923a385f2cSJames Collins                'values' => ['admin', 'always', 'none']
2933a385f2cSJames Collins            ],
2943a385f2cSJames Collins            ['keys' => ['licenseType'],                     'type' => 'choice',
2953a385f2cSJames Collins                'values' => ['badge', 'button', 'none']
2963a385f2cSJames Collins            ],
2973a385f2cSJames Collins            ['keys' => ['navbarUseTitleIcon'],              'type' => 'bool'],
2983a385f2cSJames Collins            ['keys' => ['navbarUseTitleText'],              'type' => 'bool'],
2993a385f2cSJames Collins            ['keys' => ['navbarUseTaglineText'],            'type' => 'bool'],
3003a385f2cSJames Collins            ['keys' => ['navbarShowSub'],                   'type' => 'bool'],
3013a385f2cSJames Collins            ['keys' => ['heroTitle'],                       'type' => 'bool'],
3023a385f2cSJames Collins            ['keys' => ['heroImagePropagation'],            'type' => 'bool'],
3033a385f2cSJames Collins            ['keys' => ['breadcrumbPrefix'],                'type' => 'bool'],
3043a385f2cSJames Collins            ['keys' => ['breadcrumbSep'],                   'type' => 'bool'],
3053a385f2cSJames Collins            ['keys' => ['youareherePrefix'],                'type' => 'bool'],
3063a385f2cSJames Collins            ['keys' => ['youarehereSep'],                   'type' => 'bool'],
3073a385f2cSJames Collins            ['keys' => ['sidebarShowLeft'],                 'type' => 'bool'],
3083a385f2cSJames Collins            ['keys' => ['sidebarShowRight'],                'type' => 'bool'],
3093a385f2cSJames Collins            ['keys' => ['tocFull'],                         'type' => 'bool'],
3103a385f2cSJames Collins            ['keys' => ['footerSearch'],                    'type' => 'bool'],
3113a385f2cSJames Collins            ['keys' => ['licenseImageOnly'],                'type' => 'bool'],
3123a385f2cSJames Collins            ['keys' => ['includePageUseACL'],               'type' => 'bool'],
3133a385f2cSJames Collins            ['keys' => ['includePagePropagate'],            'type' => 'bool'],
3143a385f2cSJames Collins            ['keys' => ['youarehereHideHome'],              'type' => 'bool'],
3153a385f2cSJames Collins            ['keys' => ['tagsConsolidate'],                 'type' => 'bool'],
3163a385f2cSJames Collins            ['keys' => ['footerInPage'],                    'type' => 'bool'],
3173a385f2cSJames Collins            ['keys' => ['sidebarMobileDefaultCollapse'],    'type' => 'bool'],
3183a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowLeft'],           'type' => 'bool'],
3193a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowRight'],          'type' => 'bool'],
3203a385f2cSJames Collins            ['keys' => ['searchUseTypeahead'],              'type' => 'bool'],
32112030b10SJames Collins            ['keys' => ['showLightDark'],                   'type' => 'bool'],
3223a385f2cSJames Collins            ['keys' => ['youarehereShowLast'],              'type' => 'int'],
3233a385f2cSJames Collins
3243a385f2cSJames Collins            ['keys' => ['iconTag'],                         'type' => 'string'],
3253a385f2cSJames Collins            ['keys' => ['customTheme'],                     'type' => 'string'],
3263a385f2cSJames Collins            ['keys' => ['navbarCustomMenuText'],            'type' => 'string'],
3273a385f2cSJames Collins            ['keys' => ['breadcrumbPrefixText'],            'type' => 'string'],
3283a385f2cSJames Collins            ['keys' => ['breadcrumbSepText'],               'type' => 'string'],
3293a385f2cSJames Collins            ['keys' => ['youareherePrefixText'],            'type' => 'string'],
3303a385f2cSJames Collins            ['keys' => ['youarehereSepText'],               'type' => 'string'],
3313a385f2cSJames Collins            ['keys' => ['footerCustomMenuText'],            'type' => 'string'],
3323a385f2cSJames Collins            ['keys' => ['brandURLGuest'],                   'type' => 'string'],
3333a385f2cSJames Collins            ['keys' => ['brandURLUser'],                    'type' => 'string'],
3343a385f2cSJames Collins
3353a385f2cSJames Collins            ['keys' => ['useLESS'],                         'type' => 'less'],
3363a385f2cSJames Collins        ];
3373a385f2cSJames Collins
3383a385f2cSJames Collins        foreach ($data as $row) {
3393a385f2cSJames Collins            // does not check case....
3403a385f2cSJames Collins            if (in_array($key, $row['keys']) === true) {
34195372bffSJames Collins                if (array_key_exists('type', $row) === true) {
3423a385f2cSJames Collins                    switch ($row['type']) {
3433a385f2cSJames Collins                        case 'bool':
3443a385f2cSJames Collins                            return (bool) $value;
3453a385f2cSJames Collins                        case 'int':
3463a385f2cSJames Collins                            return (int) $value;
3473a385f2cSJames Collins                        case 'string':
3483a385f2cSJames Collins                            return $value;
3493a385f2cSJames Collins                        case 'less':
35029118ed7SJames Collins                            $value = (bool) $value;
351a8df40efSJames Collins                            $lessAvailable = true;
352a8df40efSJames Collins
353a8df40efSJames Collins                            // check for less library
354a8df40efSJames Collins                            $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php';
3559cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
356a8df40efSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3579cff245bSJames Collins                            }
3589cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
359a8df40efSJames Collins                                $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3609cff245bSJames Collins                            }
3619cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
3629cff245bSJames Collins                                $lesscLib = $_SERVER['DOCUMENT_ROOT'] .
3639cff245bSJames Collins                                    '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
3649cff245bSJames Collins                            }
3659cff245bSJames Collins                            if (file_exists($lesscLib) === false) {
366a8df40efSJames Collins                                $lessAvailable = false;
367a8df40efSJames Collins                            }
368a8df40efSJames Collins
369a8df40efSJames Collins                            // check for ctype extensions
3709cff245bSJames Collins                            if (function_exists('ctype_digit') === false) {
371a8df40efSJames Collins                                $lessAvailable = false;
372a8df40efSJames Collins                            }
373a8df40efSJames Collins
3749cff245bSJames Collins                            if ($value === true && $lessAvailable === false) {
375a8df40efSJames Collins                                $this->lessIgnored = true;
37629118ed7SJames Collins                                $value = false;
37729118ed7SJames Collins                            }
3783a385f2cSJames Collins
3793a385f2cSJames Collins                            return $value;
3809cff245bSJames Collins                    }//end switch
3813a385f2cSJames Collins                }//end if
3823a385f2cSJames Collins
3833a385f2cSJames Collins                if (in_array($value, $row['values']) === true) {
3843a385f2cSJames Collins                    return $value;
3853a385f2cSJames Collins                }
3863a385f2cSJames Collins
3873a385f2cSJames Collins                if (array_key_exists('default', $row) === true) {
3883a385f2cSJames Collins                    if (is_array($row['default']) === true) {
3893a385f2cSJames Collins                        if (array_key_exists($key, $row['default']) === true) {
3903a385f2cSJames Collins                            return $row['default'][$key];
3913a385f2cSJames Collins                        }
3923a385f2cSJames Collins                    } else {
3933a385f2cSJames Collins                        return $row['default'];
3943a385f2cSJames Collins                    }
3953a385f2cSJames Collins                }
3963a385f2cSJames Collins
3973a385f2cSJames Collins                return reset($row['values']);
3983a385f2cSJames Collins            }//end if
3993a385f2cSJames Collins        }//end foreach
400c165b184SJames Collins
401c165b184SJames Collins        return $value;
402c165b184SJames Collins    }
403c165b184SJames Collins
404c165b184SJames Collins
40595372bffSJames Collins    // phpcs:enable
40695372bffSJames Collins
40795372bffSJames Collins
408c165b184SJames Collins    /**
409a8eebd82SJames Collins     * Check if a page exist in directory or namespace
410c165b184SJames Collins     *
4119cff245bSJames Collins     * @param   string $page Page/namespace to search.
412a8eebd82SJames Collins     * @return  boolean      if page exists
413c165b184SJames Collins     */
4149cff245bSJames Collins    public function pageExists(string $page)
41510b40067Snomadjimbob    {
416ab45ba71SJames Collins        ob_start();
417a8eebd82SJames Collins        tpl_includeFile($page . '.html');
418ab45ba71SJames Collins        $html = ob_get_contents();
419ab45ba71SJames Collins        ob_end_clean();
420a8eebd82SJames Collins
4213a385f2cSJames Collins        if (empty($html) === false) {
4229cff245bSJames Collins            return true;
4239cff245bSJames Collins        }
424a8eebd82SJames Collins
425a8eebd82SJames Collins        $useACL = $this->getConf('includePageUseACL');
426a8eebd82SJames Collins        $propagate = $this->getConf('includePagePropagate');
427a8eebd82SJames Collins
4289cff245bSJames Collins        if ($propagate === true) {
4299cff245bSJames Collins            if (page_findnearest($page, $useACL) !== false) {
4309cff245bSJames Collins                return true;
4319cff245bSJames Collins            }
4329cff245bSJames Collins        } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) {
4339cff245bSJames Collins            return true;
434ab45ba71SJames Collins        }
435ab45ba71SJames Collins
4369cff245bSJames Collins        return false;
437ab45ba71SJames Collins    }
438ab45ba71SJames Collins
439a8eebd82SJames Collins
440c165b184SJames Collins    /**
441a8eebd82SJames Collins     * Print or return page from directory or namespace
4422b4583abSJames Collins     *
4439cff245bSJames Collins     * @param   string  $page         Page/namespace to include.
4449cff245bSJames Collins     * @param   boolean $print        Print content.
4459cff245bSJames Collins     * @param   boolean $parse        Parse content before printing/returning.
4469cff245bSJames Collins     * @param   string  $classWrapper Wrap page in a div with class.
447ab45ba71SJames Collins     * @return  string                contents of page found
4482b4583abSJames Collins     */
4499cff245bSJames Collins    public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '')
4502b4583abSJames Collins    {
451a8eebd82SJames Collins        ob_start();
452a8eebd82SJames Collins        tpl_includeFile($page . '.html');
453a8eebd82SJames Collins        $html = ob_get_contents();
454a8eebd82SJames Collins        ob_end_clean();
455a8eebd82SJames Collins
4563a385f2cSJames Collins        if (empty($html) === true) {
457a8eebd82SJames Collins            $useACL = $this->getConf('includePageUseACL');
458a8eebd82SJames Collins            $propagate = $this->getConf('includePagePropagate');
459ab45ba71SJames Collins            $html = '';
4602b4583abSJames Collins
461ab45ba71SJames Collins            $html = tpl_include_page($page, false, $propagate, $useACL);
462ab45ba71SJames Collins        }
4632b4583abSJames Collins
4643a385f2cSJames Collins        if (empty($html) === false && $parse === true) {
465ab45ba71SJames Collins            $html = $this->parseContent($html);
466ab45ba71SJames Collins        }
4672b4583abSJames Collins
4683a385f2cSJames Collins        if (empty($classWrapper) === false && empty($html) === false) {
4699cff245bSJames Collins            $html = '<div class="' . $classWrapper . '">' . $html . '</div>';
4709cff245bSJames Collins        }
4712b4583abSJames Collins
4729cff245bSJames Collins        if ($print === true) {
4739cff245bSJames Collins            echo $html;
4749cff245bSJames Collins        }
475ab45ba71SJames Collins        return $html;
4762b4583abSJames Collins    }
4772b4583abSJames Collins
478a8eebd82SJames Collins
479a8eebd82SJames Collins    /**
480a8eebd82SJames Collins     * Print or return logged in user information
481a8eebd82SJames Collins     *
4829cff245bSJames Collins     * @param   boolean $print Print content.
483a8eebd82SJames Collins     * @return  string         user information
484a8eebd82SJames Collins     */
4859cff245bSJames Collins    public function includeLoggedIn(bool $print = true)
48610b40067Snomadjimbob    {
487a8eebd82SJames Collins        $html = '';
488a8eebd82SJames Collins
4899cff245bSJames Collins        if (empty($_SERVER['REMOTE_USER']) === false) {
490a8eebd82SJames Collins            $html .= '<div class="mikio-user-info">';
491a8eebd82SJames Collins            ob_start();
492a8eebd82SJames Collins            tpl_userinfo();
493a8eebd82SJames Collins            $html .= ob_get_contents();
494a8eebd82SJames Collins            ob_end_clean();
495a8eebd82SJames Collins            $html .= '</div>';
4962b4583abSJames Collins        }
497a8eebd82SJames Collins
4989cff245bSJames Collins        if ($print === true) {
4999cff245bSJames Collins            echo $html;
5009cff245bSJames Collins        }
501a8eebd82SJames Collins        return $html;
5022b4583abSJames Collins    }
5032b4583abSJames Collins
5042b4583abSJames Collins
505a8eebd82SJames Collins    /**
506a8eebd82SJames Collins     * Print or return DokuWiki Menu
507a8eebd82SJames Collins     *
5089cff245bSJames Collins     * @param   boolean $print Print content.
509a8eebd82SJames Collins     * @return  string         contents of the menu
510a8eebd82SJames Collins     */
5119cff245bSJames Collins    public function includeDWMenu(bool $print = true)
51210b40067Snomadjimbob    {
5132b4583abSJames Collins        global $lang;
5142b4583abSJames Collins        global $USERINFO;
515c165b184SJames Collins
5169cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
517a8eebd82SJames Collins        $html = '<ul class="mikio-nav">';
5182b4583abSJames Collins
519ab45ba71SJames Collins        $pageToolsMenu = [];
520ab45ba71SJames Collins        $siteToolsMenu = [];
521ab45ba71SJames Collins        $userToolsMenu = [];
522c165b184SJames Collins
523ab45ba71SJames Collins        $showIcons  = ($this->getConf('navbarDWMenuType') != 'text');
524ab45ba71SJames Collins        $showText   = ($this->getConf('navbarDWMenuType') != 'icons');
525ab45ba71SJames Collins        $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate');
5262b4583abSJames Collins
5272b4583abSJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
5282b4583abSJames Collins        foreach ($items as $item) {
5299cff245bSJames Collins            if ($item->getType() !== 'top') {
530ab45ba71SJames Collins                $itemHtml = '';
5312b4583abSJames Collins
532905b27c6SJames Collins                $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5339cff245bSJames Collins                if (
5343a385f2cSJames Collins                    $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5353a385f2cSJames Collins                    (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5363a385f2cSJames Collins                    (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5379cff245bSJames Collins                ) {
5389cff245bSJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') .
5399cff245bSJames Collins                        ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5409cff245bSJames Collins                    if ($showIcons === true) {
5419cff245bSJames Collins                        $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5429cff245bSJames Collins                    }
5439cff245bSJames Collins                    if ($showText === true || $isDropDown === true) {
5449cff245bSJames Collins                        $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5459cff245bSJames Collins                    }
546ab45ba71SJames Collins                    $itemHtml .= '</a>';
547ab45ba71SJames Collins
548ab45ba71SJames Collins                    $pageToolsMenu[] = $itemHtml;
5492b4583abSJames Collins                }
5509cff245bSJames Collins            }//end if
5519cff245bSJames Collins        }//end foreach
5522b4583abSJames Collins
553ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action');
554ab45ba71SJames Collins        foreach ($items as $item) {
555ab45ba71SJames Collins            $itemHtml = '';
5562b4583abSJames Collins
557905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5589cff245bSJames Collins            if (
5593a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5603a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5613a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5629cff245bSJames Collins            ) {
5639cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' .
5649cff245bSJames Collins                    $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5659cff245bSJames Collins                if ($showIcons === true) {
5669cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5679cff245bSJames Collins                }
5689cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
5699cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5709cff245bSJames Collins                }
571ab45ba71SJames Collins                $itemHtml .= '</a>';
5722b4583abSJames Collins
573ab45ba71SJames Collins                $siteToolsMenu[] = $itemHtml;
5742b4583abSJames Collins            }
5759cff245bSJames Collins        }//end foreach
5762b4583abSJames Collins
577ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\UserMenu())->getItems('action');
578ab45ba71SJames Collins        foreach ($items as $item) {
579ab45ba71SJames Collins            $itemHtml = '';
580ab45ba71SJames Collins
581905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5829cff245bSJames Collins            if (
5833a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5843a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5853a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5869cff245bSJames Collins            ) {
5879cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' .
5889cff245bSJames Collins                $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
5899cff245bSJames Collins                if ($showIcons === true) {
5909cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5919cff245bSJames Collins                }
5929cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
5939cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5949cff245bSJames Collins                }
595ab45ba71SJames Collins                $itemHtml .= '</a>';
596ab45ba71SJames Collins
597ab45ba71SJames Collins                $userToolsMenu[] = $itemHtml;
598ab45ba71SJames Collins            }
5999cff245bSJames Collins        }//end foreach
600ab45ba71SJames Collins
601ab45ba71SJames Collins
602ab45ba71SJames Collins        switch ($this->getConf('navbarDWMenuCombine')) {
603ab45ba71SJames Collins            case 'dropdown':
604ab45ba71SJames Collins                $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">';
6059cff245bSJames Collins                $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button"
6069cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6079cff245bSJames Collins                ($showIcons === true ? $this->mikioInlineIcon('file') : '') .
6089cff245bSJames Collins                ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] .
6099cff245bSJames Collins                '</span>') . '</a>';
610a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
611ab45ba71SJames Collins
612ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
613ab45ba71SJames Collins                    $html .= $item;
614ab45ba71SJames Collins                }
615ab45ba71SJames Collins
616ab45ba71SJames Collins                $html .= '</div>';
617ab45ba71SJames Collins                $html .= '</li>';
618ab45ba71SJames Collins
619a8eebd82SJames Collins                $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">';
6209cff245bSJames Collins                $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button"
6219cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6229cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('gear') : '') .
6239cff245bSJames Collins                    ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' .
6249cff245bSJames Collins                    $lang['site_tools'] . '</span>') . '</a>';
625a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
626ab45ba71SJames Collins
627ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
628ab45ba71SJames Collins                    $html .= $item;
629ab45ba71SJames Collins                }
630ab45ba71SJames Collins
631ab45ba71SJames Collins                $html .= '</div>';
632ab45ba71SJames Collins                $html .= '</li>';
633ab45ba71SJames Collins
634a8eebd82SJames Collins                $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">';
6359cff245bSJames Collins                $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button"
6369cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6379cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('user') : '') .
6389cff245bSJames Collins                    ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' .
6399cff245bSJames Collins                    $lang['user_tools'] . '</span>') . '</a>';
640a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
641ab45ba71SJames Collins
642ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
643ab45ba71SJames Collins                    $html .= $item;
644ab45ba71SJames Collins                }
645ab45ba71SJames Collins
646ab45ba71SJames Collins                $html .= '</div>';
647ab45ba71SJames Collins                $html .= '</li>';
648ab45ba71SJames Collins
649ab45ba71SJames Collins                break;
650ab45ba71SJames Collins
651ab45ba71SJames Collins            case 'combine':
652ab45ba71SJames Collins                $html .= '<li class="mikio-nav-dropdown">';
6539cff245bSJames Collins                $html .= '<a class="mikio-nav-link" href="#">' .
6549cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') .
6559cff245bSJames Collins                    ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' .
6569cff245bSJames Collins                    tpl_getLang('tools-menu') . '</span>') . '</a>';
657a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
658ab45ba71SJames Collins
659ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>';
660ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
661ab45ba71SJames Collins                    $html .= $item;
662ab45ba71SJames Collins                }
663ab45ba71SJames Collins
664ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
665ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>';
666ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
667ab45ba71SJames Collins                    $html .= $item;
668ab45ba71SJames Collins                }
669ab45ba71SJames Collins
670ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
671ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>';
672ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
673ab45ba71SJames Collins                    $html .= $item;
674ab45ba71SJames Collins                }
675ab45ba71SJames Collins
676ab45ba71SJames Collins                $html .= '</div>';
677ab45ba71SJames Collins                $html .= '</li>';
678ab45ba71SJames Collins                break;
679ab45ba71SJames Collins
680ab45ba71SJames Collins            default:    // seperate
681ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
682a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
683ab45ba71SJames Collins                }
684ab45ba71SJames Collins
685ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
686a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
687a8eebd82SJames Collins                }
688a8eebd82SJames Collins
689a8eebd82SJames Collins                foreach ($userToolsMenu as $item) {
690a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
691ab45ba71SJames Collins                }
692ab45ba71SJames Collins
693ab45ba71SJames Collins                break;
6949cff245bSJames Collins        }//end switch
695ab45ba71SJames Collins
69612030b10SJames Collins        if ($this->getConf('showLightDark') === true) {
6979e41d878SJames Collins            $html .= '<li class="mikio-darklight">
6989e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' .
6999e41d878SJames Collins            $this->mikioInlineIcon('sun', 'mikio-darklight-light') .
7009e41d878SJames Collins            $this->mikioInlineIcon('moon', 'mikio-darklight-dark') .
7019e41d878SJames Collins            '</a></li>';
70212030b10SJames Collins        }
70312030b10SJames Collins
704ab45ba71SJames Collins        $html .= '</ul>';
705ab45ba71SJames Collins
7069cff245bSJames Collins        if ($print === true) {
7079cff245bSJames Collins            echo $html;
7089cff245bSJames Collins        }
709a8eebd82SJames Collins        return $html;
710a8eebd82SJames Collins    }
711a8eebd82SJames Collins
712a8eebd82SJames Collins
713a8eebd82SJames Collins    /**
714a8eebd82SJames Collins     * Create a nav element from a string. <uri>|<title>;
715a8eebd82SJames Collins     *
7169cff245bSJames Collins     * @param string $str String to generate nav.
717a8eebd82SJames Collins     * @return string     nav elements generated
718a8eebd82SJames Collins     */
7199cff245bSJames Collins    public function stringToNav(string $str)
72010b40067Snomadjimbob    {
721a8eebd82SJames Collins        $html = '';
722a8eebd82SJames Collins
7233a385f2cSJames Collins        if (empty($str) === false) {
724a8eebd82SJames Collins            $items = explode(';', $str);
725a8eebd82SJames Collins            if (count($items) > 0) {
726a8eebd82SJames Collins                $html .= '<ul class="mikio-nav">';
727a8eebd82SJames Collins                foreach ($items as $item) {
728a8eebd82SJames Collins                    $parts = explode('|', $item);
729a8eebd82SJames Collins                    if ($parts > 1) {
7309cff245bSJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' .
7319cff245bSJames Collins                            strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) .
7329cff245bSJames Collins                            '</a></li>';
733a8eebd82SJames Collins                    }
734a8eebd82SJames Collins                }
735a8eebd82SJames Collins                $html .= '</ul>';
736a8eebd82SJames Collins            }
7372b4583abSJames Collins        }
7382b4583abSJames Collins
739ab45ba71SJames Collins        return $html;
7402b4583abSJames Collins    }
7412b4583abSJames Collins
742a8eebd82SJames Collins    /**
743ab45ba71SJames Collins     * print or return the main navbar
7442b4583abSJames Collins     *
7459cff245bSJames Collins     * @param boolean $print   Print the navbar.
7469cff245bSJames Collins     * @param boolean $showSub Include the sub navbar.
747ab45ba71SJames Collins     * @return string          generated content
7482b4583abSJames Collins     */
7499cff245bSJames Collins    public function includeNavbar(bool $print = true, bool $showSub = false)
75010b40067Snomadjimbob    {
751b39ad16dSJames Collins        global $conf, $USERINFO;
752d3d7d2b7SJames Collins
753d3d7d2b7SJames Collins        $homeUrl = wl();
754d3d7d2b7SJames Collins
7559cff245bSJames Collins        if (plugin_isdisabled('showpageafterlogin') === false) {
756d3d7d2b7SJames Collins            $p = &plugin_load('action', 'showpageafterlogin');
7573a385f2cSJames Collins            if (empty($p) === false) {
7589cff245bSJames Collins                if (is_array($USERINFO) === true && count($USERINFO) > 0) {
759d3d7d2b7SJames Collins                    $homeUrl = wl($p->getConf('page_after_login'));
760d3d7d2b7SJames Collins                }
761d3d7d2b7SJames Collins            }
762b39ad16dSJames Collins        } else {
7639cff245bSJames Collins            if (is_array($USERINFO) === true && count($USERINFO) > 0) {
764b39ad16dSJames Collins                $url = $this->getConf('brandURLUser');
765b39ad16dSJames Collins                if (strlen($url) > 0) {
766b39ad16dSJames Collins                    $homeUrl = $url;
767d3d7d2b7SJames Collins                }
768b39ad16dSJames Collins            } else {
769b39ad16dSJames Collins                $url = $this->getConf('brandURLGuest');
770b39ad16dSJames Collins                if (strlen($url) > 0) {
771b39ad16dSJames Collins                    $homeUrl = $url;
772b39ad16dSJames Collins                }
773b39ad16dSJames Collins            }
774b39ad16dSJames Collins        }
775d3d7d2b7SJames Collins
776ab45ba71SJames Collins        $html = '';
77747161538SJames Collins
7789cff245bSJames Collins        $html .= '<nav class="mikio-navbar'  . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') .
7799cff245bSJames Collins            '">';
780f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
781d3d7d2b7SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">';
7829cff245bSJames Collins        if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) {
783ab45ba71SJames Collins            // Brand image
7849cff245bSJames Collins            if ($this->getConf('navbarUseTitleIcon') === true) {
7859cff245bSJames Collins                $logo = $this->getMediaFile('logo', false);
7869cff245bSJames Collins                ;
7873a385f2cSJames Collins                if (empty($logo) === false) {
788f0241fc4SJames Collins                    $width = $this->getConf('navbarTitleIconWidth');
789f0241fc4SJames Collins                    $height = $this->getConf('navbarTitleIconHeight');
790f0241fc4SJames Collins                    $styles = '';
791f0241fc4SJames Collins
792f0241fc4SJames Collins                    if (strlen($width) > 0 || strlen($height) > 0) {
7939cff245bSJames Collins                        if (ctype_digit($width) === true) {
794f0241fc4SJames Collins                            $styles .= 'max-width:' . intval($width) . 'px;';
7959cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) {
796f0241fc4SJames Collins                            $styles .= 'max-width:' . $width . ';';
7979cff245bSJames Collins                        } elseif (strcasecmp($width, 'none') === 0) {
7987a92c19bSJames Collins                            $styles .= 'max-width:none;';
799f0241fc4SJames Collins                        }
800f0241fc4SJames Collins
8019cff245bSJames Collins                        if (ctype_digit($height) === true) {
802f0241fc4SJames Collins                            $styles .= 'max-height:' . intval($height) . 'px;';
8039cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) {
804f0241fc4SJames Collins                            $styles .= 'max-height:' . $height . ';';
8059cff245bSJames Collins                        } elseif (strcasecmp($height, 'none') === 0) {
8067a92c19bSJames Collins                            $styles .= 'max-height:none;';
807f0241fc4SJames Collins                        }
808f0241fc4SJames Collins
809f0241fc4SJames Collins                        if (strlen($styles) > 0) {
810f0241fc4SJames Collins                            $styles = ' style="' . $styles . '"';
811f0241fc4SJames Collins                        }
8129cff245bSJames Collins                    }//end if
813f0241fc4SJames Collins
814f0241fc4SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>';
8159cff245bSJames Collins                }//end if
8169cff245bSJames Collins            }//end if
817ab45ba71SJames Collins
818ab45ba71SJames Collins            // Brand title
8199cff245bSJames Collins            if ($this->getConf('navbarUseTitleText') === true) {
820ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
821a8eebd82SJames Collins                $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>';
8229cff245bSJames Collins                if ($this->getConf('navbarUseTaglineText') === true) {
823a8eebd82SJames Collins                    $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>';
824ab45ba71SJames Collins                }
825ab45ba71SJames Collins                $html .= '</div>';
826ab45ba71SJames Collins            }
8279cff245bSJames Collins        }//end if
828ab45ba71SJames Collins        $html .= '</a>';
829660b2c71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>';
830ab45ba71SJames Collins
831ab45ba71SJames Collins        // Menus
832ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
833ab45ba71SJames Collins
8349cff245bSJames Collins        $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'),
8359cff245bSJames Collins            $this->getConf('navbarPosRight', 'none')
8369cff245bSJames Collins        ];
837a8eebd82SJames Collins        foreach ($menus as $menuType) {
838a8eebd82SJames Collins            switch ($menuType) {
839a8eebd82SJames Collins                case 'custom':
840a8eebd82SJames Collins                    $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', ''));
841a8eebd82SJames Collins                    break;
842a8eebd82SJames Collins                case 'search':
843ab45ba71SJames Collins                    $html .= '<div class="mikio-nav-item">';
844ab45ba71SJames Collins                    $html .= $this->includeSearch(false);
845ab45ba71SJames Collins                    $html .= '</div>';
846a8eebd82SJames Collins                    break;
847a8eebd82SJames Collins                case 'dokuwiki':
8489cff245bSJames Collins                    $html .= $this->includeDWMenu(false);
849a8eebd82SJames Collins                    break;
850a8eebd82SJames Collins            }
851a8eebd82SJames Collins        }
852ab45ba71SJames Collins
853ab45ba71SJames Collins        $html .= '</div>';
854f8039bf2SJames Collins        $html .= '</div>';
855ab45ba71SJames Collins        $html .= '</nav>';
856ab45ba71SJames Collins
857a8eebd82SJames Collins        // Sub Navbar
8589cff245bSJames Collins        if ($showSub === true) {
8599cff245bSJames Collins            $sub = $this->includePage('submenu', false);
8603a385f2cSJames Collins            if (empty($sub) === false) {
8619cff245bSJames Collins                $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>';
8629cff245bSJames Collins            }
863ab45ba71SJames Collins        }
864ab45ba71SJames Collins
8659cff245bSJames Collins        if ($print === true) {
8669cff245bSJames Collins            echo $html;
8679cff245bSJames Collins        }
868ab45ba71SJames Collins        return $html;
869ab45ba71SJames Collins    }
870ab45ba71SJames Collins
871ab45ba71SJames Collins
872a8eebd82SJames Collins    /**
873a8eebd82SJames Collins     * Is there a sidebar
874a8eebd82SJames Collins     *
8759cff245bSJames Collins     * @param   string $prefix Sidebar prefix to use when searching.
876a8eebd82SJames Collins     * @return  boolean        if sidebar exists
877a8eebd82SJames Collins     */
8789cff245bSJames Collins    public function sidebarExists(string $prefix = '')
87910b40067Snomadjimbob    {
880a8eebd82SJames Collins        global $conf;
881a8eebd82SJames Collins
8823a385f2cSJames Collins        if (strcasecmp($prefix, 'left') === 0) {
8839cff245bSJames Collins            $prefix = '';
8849cff245bSJames Collins        }
885a8eebd82SJames Collins
886a8eebd82SJames Collins        return $this->pageExists($conf['sidebar' . $prefix]);
887a8eebd82SJames Collins    }
888a8eebd82SJames Collins
889a8eebd82SJames Collins
890a8eebd82SJames Collins    /**
891ab45ba71SJames Collins     * Print or return the sidebar content
892ab45ba71SJames Collins     *
8939cff245bSJames Collins     * @param   string  $prefix Sidebar prefix to use when searching.
8949cff245bSJames Collins     * @param   boolean $print  Print the generated content to the output buffer.
8959cff245bSJames Collins     * @param   boolean $parse  Parse the content.
896ab45ba71SJames Collins     * @return  string          generated content
897ab45ba71SJames Collins     */
8989cff245bSJames Collins    public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true)
89910b40067Snomadjimbob    {
900ab45ba71SJames Collins        global $conf, $ID;
901ab45ba71SJames Collins
902ab45ba71SJames Collins        $html = '';
903ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
904ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
905ab45ba71SJames Collins
9063a385f2cSJames Collins        if (empty($confPrefix) === true) {
9079cff245bSJames Collins            $confPrefix = 'Left';
9089cff245bSJames Collins        }
9091cdedf28SJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9109cff245bSJames Collins            $prefix = '';
9119cff245bSJames Collins        }
912ab45ba71SJames Collins
9131cdedf28SJames Collins        $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar'];
914ab45ba71SJames Collins
9159cff245bSJames Collins        if (
9169cff245bSJames Collins            $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false &&
9171cdedf28SJames Collins            p_get_metadata($ID, 'nosidebar', false) === null
9189cff245bSJames Collins        ) {
9199cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'header', false);
9203a385f2cSJames Collins            if (empty($content) === false) {
9219cff245bSJames Collins                $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
9229cff245bSJames Collins            }
923ab45ba71SJames Collins
9243a385f2cSJames Collins            if (empty($prefix) === true) {
9259cff245bSJames Collins                $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'),
9269cff245bSJames Collins                    $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4')
9279cff245bSJames Collins                ];
928ab45ba71SJames Collins
929a8eebd82SJames Collins                foreach ($rows as $row) {
930a8eebd82SJames Collins                    switch ($row) {
931a8eebd82SJames Collins                        case 'search':
9329cff245bSJames Collins                            $html .= $this->includeSearch(false);
933a8eebd82SJames Collins                            break;
934a8eebd82SJames Collins                        case 'logged in user':
9359cff245bSJames Collins                            $html .= $this->includeLoggedIn(false);
936a8eebd82SJames Collins                            break;
937a8eebd82SJames Collins                        case 'content':
9389cff245bSJames Collins                            $content = $this->includePage($sidebarPage, false);
9393a385f2cSJames Collins                            if (empty($content) === false) {
9409cff245bSJames Collins                                $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9419cff245bSJames Collins                            }
942a8eebd82SJames Collins                            break;
943a8eebd82SJames Collins                        case 'tags':
944a8eebd82SJames Collins                            $html .= '<div class="mikio-tags"></div>';
945a8eebd82SJames Collins                    }
946a8eebd82SJames Collins                }
947a8eebd82SJames Collins            } else {
9489cff245bSJames Collins                $content = $this->includePage($sidebarPage, false);
9493a385f2cSJames Collins                if (empty($content) === false) {
9509cff245bSJames Collins                    $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9519cff245bSJames Collins                }
9529cff245bSJames Collins            }//end if
9539cff245bSJames Collins
9549cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'footer', false);
9553a385f2cSJames Collins            if (empty($content) === false) {
9569cff245bSJames Collins                $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
9579cff245bSJames Collins            }
9589cff245bSJames Collins        }//end if
9599cff245bSJames Collins
9603a385f2cSJames Collins        if (empty($html) === true) {
9613a385f2cSJames Collins            if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) {
9629cff245bSJames Collins                $html = '&nbsp;';
9639cff245bSJames Collins            }
9649cff245bSJames Collins            if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) {
9659cff245bSJames Collins                $html = '&nbsp;';
9669cff245bSJames Collins            }
967a8eebd82SJames Collins        }
968ab45ba71SJames Collins
9693a385f2cSJames Collins        if (empty($html) === false) {
9701cdedf28SJames Collins            $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) .
9719cff245bSJames Collins                '"><a class="mikio-sidebar-toggle' .
9729cff245bSJames Collins                ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' .
9739cff245bSJames Collins                tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' .
9749cff245bSJames Collins                $html . '</div></aside>';
975ab45ba71SJames Collins        }
976ab45ba71SJames Collins
9779cff245bSJames Collins        if ($parse === true) {
9789cff245bSJames Collins            $html = $this->includeIcons($html);
9793a04a100SJames Collins        }
9809cff245bSJames Collins        if ($print === true) {
9819cff245bSJames Collins            echo $html;
982ab45ba71SJames Collins        }
983ab45ba71SJames Collins        return $html;
984ab45ba71SJames Collins    }
985ab45ba71SJames Collins
986ab45ba71SJames Collins
987a8eebd82SJames Collins    /**
988ab45ba71SJames Collins     * Print or return the page tools content
989ab45ba71SJames Collins     *
9909cff245bSJames Collins     * @param   boolean $print     Print the generated content to the output buffer.
9919cff245bSJames Collins     * @param   boolean $includeId Include the dw__pagetools id in the element.
992ab45ba71SJames Collins     * @return  string             generated content
993ab45ba71SJames Collins     */
9949cff245bSJames Collins    public function includePageTools(bool $print = true, bool $includeId = false)
99510b40067Snomadjimbob    {
9961293ce10SJames Collins        global $USERINFO;
9971293ce10SJames Collins
9989cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
999ab45ba71SJames Collins        $html = '';
1000ab45ba71SJames Collins
10019cff245bSJames Collins        $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
1002b9c0582bSJames Collins        $html .= '<ul class="tools">';
1003ab45ba71SJames Collins
1004ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
1005ab45ba71SJames Collins        foreach ($items as $item) {
10069cff245bSJames Collins            $classes = [];
10073fd763a0SJames Collins            $classes[] = $item->getType();
10083fd763a0SJames Collins            $attr = $item->getLinkAttributes();
10093fd763a0SJames Collins
10109cff245bSJames Collins            if (empty($attr['class']) === false) {
10113fd763a0SJames Collins                $classes = array_merge($classes, explode(' ', $attr['class']));
1012ab45ba71SJames Collins            }
1013ab45ba71SJames Collins
10143fd763a0SJames Collins            $classes = array_unique($classes);
10153fd763a0SJames Collins
10161293ce10SJames Collins            $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()));
10179cff245bSJames Collins            if (
10183a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
10193a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
10203a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true))
10219cff245bSJames Collins            ) {
10223fd763a0SJames Collins                $html .= '<li class="' . implode(' ', $classes) . '">';
10239cff245bSJames Collins                $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' .
10249cff245bSJames Collins                    $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) .
10259cff245bSJames Collins                    '</div><span class="a11y">' . $item->getLabel() . '</span></a>';
10263fd763a0SJames Collins                $html .= '</li>';
10273fd763a0SJames Collins            }
10289cff245bSJames Collins        }//end foreach
10293fd763a0SJames Collins
10303fd763a0SJames Collins        $html .= '</ul>';
1031ab45ba71SJames Collins        $html .= '</nav>';
1032ab45ba71SJames Collins
10339cff245bSJames Collins        if ($print === true) {
10349cff245bSJames Collins            echo $html;
10359cff245bSJames Collins        }
1036ab45ba71SJames Collins        return $html;
1037ab45ba71SJames Collins    }
1038ab45ba71SJames Collins
1039ab45ba71SJames Collins
1040a8eebd82SJames Collins    /**
1041a8eebd82SJames Collins     * Print or return the search bar
1042a8eebd82SJames Collins     *
10439cff245bSJames Collins     * @param   boolean $print Print content.
1044a8eebd82SJames Collins     * @return  string         contents of the search bar
1045a8eebd82SJames Collins     */
10469cff245bSJames Collins    public function includeSearch(bool $print = true)
104710b40067Snomadjimbob    {
10489cff245bSJames Collins        global $lang, $ID, $ACT, $QUERY;
1049ab45ba71SJames Collins        $html = '';
1050ab45ba71SJames Collins
10519cff245bSJames Collins        $html .= '<form class="mikio-search search" action="' . wl() .
10529cff245bSJames Collins            '" accept-charset="utf-8" method="get" role="search">';
1053a8eebd82SJames Collins        $html .= '<input type="hidden" name="do" value="search">';
1054a8eebd82SJames Collins        $html .= '<input type="hidden" name="id" value="' . $ID . '">';
1055c1cb9f15SChris MacMackin        $html .= '<input name="q" ';
10569cff245bSJames Collins        if ($this->getConf('searchUseTypeahead') === true) {
1057c1cb9f15SChris MacMackin            $html .= 'class="search_typeahead" ';
1058c1cb9f15SChris MacMackin        }
10599cff245bSJames Collins        $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' .
10603a385f2cSJames Collins            ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
1061a8eebd82SJames Collins        $html .= '<button type="submit" title="' .  $lang['btn_search'] . '">';
10623a385f2cSJames Collins        if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) {
1063a8eebd82SJames Collins            $html .= $this->mikioInlineIcon('search');
1064ab45ba71SJames Collins        } else {
1065ab45ba71SJames Collins            $html .= $lang['btn_search'];
1066ab45ba71SJames Collins        }
1067ab45ba71SJames Collins        $html .= '</button>';
1068ab45ba71SJames Collins        $html .= '</form>';
1069ab45ba71SJames Collins
10709cff245bSJames Collins        if ($print === true) {
10719cff245bSJames Collins            echo $html;
10729cff245bSJames Collins        }
1073ab45ba71SJames Collins        return $html;
1074ab45ba71SJames Collins    }
1075ab45ba71SJames Collins
1076ab45ba71SJames Collins
1077a8eebd82SJames Collins    /**
1078a8eebd82SJames Collins     * Print or return content
1079a8eebd82SJames Collins     *
10809cff245bSJames Collins     * @param   boolean $print Print content.
1081a8eebd82SJames Collins     * @return  string         contents
1082a8eebd82SJames Collins     */
10839cff245bSJames Collins    public function includeContent(bool $print = true)
108410b40067Snomadjimbob    {
1085ab45ba71SJames Collins        ob_start();
10869cff245bSJames Collins        tpl_content(false);
1087ab45ba71SJames Collins        $html = ob_get_contents();
1088ab45ba71SJames Collins        ob_end_clean();
1089ab45ba71SJames Collins
1090ab45ba71SJames Collins        $html = $this->includeIcons($html);
1091ab45ba71SJames Collins        $html = $this->parseContent($html);
1092ab45ba71SJames Collins
1093ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
1094ab45ba71SJames Collins
10959cff245bSJames Collins        if ($this->getConf('heroTitle') === false) {
10969cff245bSJames Collins            $html = '<div class="mikio-tags"></div>' . $html;
10979cff245bSJames Collins        }
1098a8eebd82SJames Collins
1099a8eebd82SJames Collins        $html = '<div class="mikio-article-content">' . $html . '</div>';
1100a8eebd82SJames Collins
11019cff245bSJames Collins        if ($print === true) {
11029cff245bSJames Collins            echo $html;
11039cff245bSJames Collins        }
1104ab45ba71SJames Collins        return $html;
1105ab45ba71SJames Collins    }
1106ab45ba71SJames Collins
1107a8eebd82SJames Collins    /**
1108ab45ba71SJames Collins     * Print or return footer
1109ab45ba71SJames Collins     *
11109cff245bSJames Collins     * @param   boolean $print Print footer.
11119cff245bSJames Collins     * @return  string         HTML string containing footer
1112ab45ba71SJames Collins     */
11139cff245bSJames Collins    public function includeFooter(bool $print = true)
111410b40067Snomadjimbob    {
1115ab45ba71SJames Collins        global $ACT;
1116ab45ba71SJames Collins
1117ab45ba71SJames Collins        $html = '';
1118ab45ba71SJames Collins
1119ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
11209cff245bSJames Collins        $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>';
11219cff245bSJames Collins        $html .= $this->includePage('footer', false);
1122ab45ba71SJames Collins
1123a8eebd82SJames Collins        $html .= $this->stringToNav($this->getConf('footerCustomMenuText'));
1124ab45ba71SJames Collins
11259cff245bSJames Collins        if ($this->getConf('footerSearch') === true) {
1126ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
11279cff245bSJames Collins            $html .= $this->includeSearch(false);
1128ab45ba71SJames Collins            $html .= '</div>';
1129ab45ba71SJames Collins        }
1130ab45ba71SJames Collins
1131a8eebd82SJames Collins        $showPageTools = $this->getConf('pageToolsFooter');
11329cff245bSJames Collins        if (
11333a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 ||
11343a385f2cSJames Collins            $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0)
11359cff245bSJames Collins        ) {
11369cff245bSJames Collins            $html .= $this->includePageTools(false);
11379cff245bSJames Collins        }
1138ab45ba71SJames Collins
11399cff245bSJames Collins        $meta['licenseType']            = ['multichoice', '_choices' => ['none', 'badge', 'button']];
11409cff245bSJames Collins        $meta['licenseImageOnly']       = ['onoff'];
1141ab45ba71SJames Collins
1142ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
11439cff245bSJames Collins        if ($licenseType !== 'none') {
11449cff245bSJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true);
1145ab45ba71SJames Collins        }
1146ab45ba71SJames Collins
1147ab45ba71SJames Collins        $html .= '</footer>';
1148ab45ba71SJames Collins
11499cff245bSJames Collins        if ($print === true) {
11509cff245bSJames Collins            echo $html;
11519cff245bSJames Collins        }
1152ab45ba71SJames Collins        return $html;
1153ab45ba71SJames Collins    }
1154ab45ba71SJames Collins
1155ab45ba71SJames Collins
1156a8eebd82SJames Collins    /**
1157ab45ba71SJames Collins     * Print or return breadcrumb trail
1158ab45ba71SJames Collins     *
11599cff245bSJames Collins     * @param   boolean $print Print out trail.
11609cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
11619cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
1162ab45ba71SJames Collins     */
11639cff245bSJames Collins    public function includeBreadcrumbs(bool $print = true, bool $parse = true)
116410b40067Snomadjimbob    {
1165a8eebd82SJames Collins        global $conf, $ID, $lang, $ACT;
1166a8eebd82SJames Collins
11673a385f2cSJames Collins        if (
11683a385f2cSJames Collins            $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 &&
116995372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0
11703a385f2cSJames Collins        ) {
11719cff245bSJames Collins            return '';
11729cff245bSJames Collins        }
1173ab45ba71SJames Collins
1174ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
1175f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
11763a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
117795372bffSJames Collins            if ($conf['breadcrumbs'] !== 0) {
11789cff245bSJames Collins                if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) {
1179ab45ba71SJames Collins                    ob_start();
118075adba86SJames Collins                    tpl_breadcrumbs();
1181ab45ba71SJames Collins                    $html .= ob_get_contents();
1182ab45ba71SJames Collins                    ob_end_clean();
1183ab45ba71SJames Collins                } else {
1184ab45ba71SJames Collins                    $sep = '•';
1185ab45ba71SJames Collins                    $prefix = $lang['breadcrumb'];
1186ab45ba71SJames Collins
11879cff245bSJames Collins                    if ($this->getConf('breadcrumbSep') === true) {
1188ab45ba71SJames Collins                        $sep = $this->getConf('breadcrumbSepText');
11899cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-sep', false);
1190ab45ba71SJames Collins
11919cff245bSJames Collins                        if ($img !== false) {
1192ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1193ab45ba71SJames Collins                        }
119447161538SJames Collins                    }
119547161538SJames Collins
11969cff245bSJames Collins                    if ($this->getConf('breadcrumbPrefix') === true) {
1197ab45ba71SJames Collins                        $prefix = $this->getConf('breadcrumbPrefixText');
11989cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-prefix', false);
1199ab45ba71SJames Collins
12009cff245bSJames Collins                        if ($img !== false) {
1201ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
1202ab45ba71SJames Collins                        }
1203ab45ba71SJames Collins                    }
1204ab45ba71SJames Collins
1205ab45ba71SJames Collins                    $crumbs = breadcrumbs();
1206ab45ba71SJames Collins
1207ab45ba71SJames Collins                    $html .= '<ul>';
12083a385f2cSJames Collins                    if (empty($prefix) === false) {
12099cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12109cff245bSJames Collins                    }
1211ab45ba71SJames Collins
1212ab45ba71SJames Collins                    $last = count($crumbs);
1213ab45ba71SJames Collins                    $i    = 0;
1214ab45ba71SJames Collins                    foreach ($crumbs as $id => $name) {
1215ab45ba71SJames Collins                        $i++;
121695372bffSJames Collins                        if ($i !== 1) {
1217ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
121895372bffSJames Collins                        }
12199cff245bSJames Collins                        $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>';
12209cff245bSJames Collins                        $html .= tpl_pagelink($id, null, true);
1221ab45ba71SJames Collins                        $html .= '</li>';
1222ab45ba71SJames Collins                    }
1223ab45ba71SJames Collins
1224ab45ba71SJames Collins                    $html .= '</ul>';
12259cff245bSJames Collins                }//end if
12269cff245bSJames Collins            }//end if
12279cff245bSJames Collins        }//end if
12283d11a778SJames Collins
12293d11a778SJames Collins        $html .= '</div>';
12303d11a778SJames Collins        $html .= '</div>';
12313d11a778SJames Collins
12329cff245bSJames Collins        if ($parse === true) {
12339cff245bSJames Collins            $html = $this->includeIcons($html);
12349cff245bSJames Collins        }
12359cff245bSJames Collins        if ($print === true) {
12369cff245bSJames Collins            echo $html;
12379cff245bSJames Collins        }
12383d11a778SJames Collins        return $html;
12393d11a778SJames Collins    }
12403d11a778SJames Collins
12413d11a778SJames Collins    /**
12423d11a778SJames Collins     * Print or return you are here trail
12433d11a778SJames Collins     *
12449cff245bSJames Collins     * @param   boolean $print Print out trail.
12459cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12469cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
12473d11a778SJames Collins     */
12489cff245bSJames Collins    public function includeYouAreHere(bool $print = true, bool $parse = true)
12493d11a778SJames Collins    {
12503d11a778SJames Collins        global $conf, $ID, $lang, $ACT;
12513d11a778SJames Collins
12523a385f2cSJames Collins        if (
12533a385f2cSJames Collins            $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 &&
125495372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0
12553a385f2cSJames Collins        ) {
12569cff245bSJames Collins            return '';
12579cff245bSJames Collins        }
12583d11a778SJames Collins
12593d11a778SJames Collins        $html = '<div class="mikio-youarehere">';
12603d11a778SJames Collins        $html .= '<div class="mikio-container">';
12613a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
126295372bffSJames Collins            if ($conf['youarehere'] !== 0) {
12639cff245bSJames Collins                if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) {
126495372bffSJames Collins                    $html .= '<div class="mikio-bcdw">';
1265ab45ba71SJames Collins                    ob_start();
126675adba86SJames Collins                    tpl_youarehere();
1267ab45ba71SJames Collins                    $html .= ob_get_contents();
1268ab45ba71SJames Collins                    ob_end_clean();
126995372bffSJames Collins                    $html .= '</div>';
1270ab45ba71SJames Collins                } else {
1271ab45ba71SJames Collins                    $sep = ' » ';
1272ab45ba71SJames Collins                    $prefix = $lang['youarehere'];
1273ab45ba71SJames Collins
12749cff245bSJames Collins                    if ($this->getConf('youarehereSep') === true) {
12753d11a778SJames Collins                        $sep = $this->getConf('youarehereSepText');
12769cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-sep', false);
1277ab45ba71SJames Collins
12789cff245bSJames Collins                        if ($img !== false) {
1279ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1280ab45ba71SJames Collins                        }
128175adba86SJames Collins                    }
128275adba86SJames Collins
12839cff245bSJames Collins                    if ($this->getConf('youareherePrefix') === true) {
12843d11a778SJames Collins                        $prefix = $this->getConf('youareherePrefixText');
12859cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-prefix', false);
1286ab45ba71SJames Collins
12879cff245bSJames Collins                        if ($img !== false) {
1288ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
128975adba86SJames Collins                        }
129047161538SJames Collins                    }
129147161538SJames Collins
1292ab45ba71SJames Collins                    $html .= '<ul>';
12933a385f2cSJames Collins                    if (empty($prefix) === false) {
12949cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12959cff245bSJames Collins                    }
12969cff245bSJames Collins                    $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>';
1297ab45ba71SJames Collins
1298ab45ba71SJames Collins                    $parts = explode(':', $ID);
1299ab45ba71SJames Collins                    $count = count($parts);
1300ab45ba71SJames Collins
1301ab45ba71SJames Collins                    $part = '';
13029cff245bSJames Collins                    for ($i = 0; $i < ($count - 1); $i++) {
1303ab45ba71SJames Collins                        $part .= $parts[$i] . ':';
1304ab45ba71SJames Collins                        $page = $part;
13059cff245bSJames Collins                        if ($page === $conf['start']) {
13069cff245bSJames Collins                            continue;
13079cff245bSJames Collins                        }
1308ab45ba71SJames Collins
1309ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
13109cff245bSJames Collins                        $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1311ab45ba71SJames Collins                    }
1312ab45ba71SJames Collins
1313ab45ba71SJames Collins                    resolve_pageid('', $page, $exists);
13149cff245bSJames Collins                    if ((isset($page) === true && $page === $part . $parts[$i]) === false) {
1315ab45ba71SJames Collins                        $page = $part . $parts[$i];
13169cff245bSJames Collins                        if ($page !== $conf['start']) {
1317ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
13189cff245bSJames Collins                            $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1319ab45ba71SJames Collins                        }
1320ab45ba71SJames Collins                    }
1321ab45ba71SJames Collins
1322ab45ba71SJames Collins                    $html .= '</ul>';
13239cff245bSJames Collins                }//end if
13249cff245bSJames Collins            }//end if
1325ab45ba71SJames Collins
13263d11a778SJames Collins            $showLast = $this->getConf('youarehereShowLast');
13279cff245bSJames Collins            if ($showLast !== 0) {
1328a8eebd82SJames Collins                preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches);
13299cff245bSJames Collins                if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) {
1330a8eebd82SJames Collins                    $count = count($matches[0]);
1331a8eebd82SJames Collins                    $list = '';
1332a8eebd82SJames Collins
1333a8eebd82SJames Collins                    // Show Home
1334a8eebd82SJames Collins                    $list .= $matches[0][0] . $matches[0][1];
1335a8eebd82SJames Collins
1336a8eebd82SJames Collins                    $list .= '<li>...</li>';
13379cff245bSJames Collins                    for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) {
1338a8eebd82SJames Collins                        $list .= $matches[0][$i];
1339a8eebd82SJames Collins                    }
1340a8eebd82SJames Collins
1341a8eebd82SJames Collins                    $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html);
1342a8eebd82SJames Collins                }
1343a8eebd82SJames Collins            }
1344a8eebd82SJames Collins
13453d11a778SJames Collins            switch ($this->getConf('youarehereHome')) {
1346a8eebd82SJames Collins                case 'none':
1347a8eebd82SJames Collins                    $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2);
1348a8eebd82SJames Collins                    break;
1349a8eebd82SJames Collins                case 'home':
1350a8eebd82SJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1);
1351a8eebd82SJames Collins                    break;
1352a8eebd82SJames Collins                case 'icon':
13539cff245bSJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' .
13549cff245bSJames Collins                        $this->mikioInlineIcon('home') . '$3', $html, 1);
1355a8eebd82SJames Collins                    break;
1356a8eebd82SJames Collins            }
1357a8eebd82SJames Collins        } else {
1358a8eebd82SJames Collins            $html .= '&#8810; ';
13599cff245bSJames Collins            if (isset($_GET['page']) === true) {
13609cff245bSJames Collins                $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
1361a8eebd82SJames Collins            }
13624057121fSJames Collins            $html .= '<a href="' . wl($ID) . '">View Page</a>';
13639cff245bSJames Collins        }//end if
13649cff245bSJames Collins
13659cff245bSJames Collins        $html .= '</div>';
13669cff245bSJames Collins        $html .= '</div>';
13679cff245bSJames Collins
13689cff245bSJames Collins        if ($parse === true) {
13699cff245bSJames Collins            $html = $this->includeIcons($html);
1370a8eebd82SJames Collins        }
13719cff245bSJames Collins        if ($print === true) {
13729cff245bSJames Collins            echo $html;
13739cff245bSJames Collins        }
1374ab45ba71SJames Collins        return $html;
1375ab45ba71SJames Collins    }
1376ab45ba71SJames Collins
13771785fc73SJames Collins    /**
13781785fc73SJames Collins     * Get Page Title
13799cff245bSJames Collins     *
13809cff245bSJames Collins     * @return string page title
13811785fc73SJames Collins     */
138210b40067Snomadjimbob    public function parsePageTitle()
138310b40067Snomadjimbob    {
13842060e56cSJames Collins        global $ID;
13852060e56cSJames Collins
13862060e56cSJames Collins        $title = p_get_first_heading($ID);
13879cff245bSJames Collins        if (strlen($title) <= 0) {
13889cff245bSJames Collins            $title = tpl_pagetitle(null, true);
13899cff245bSJames Collins        }
13901785fc73SJames Collins        $title = $this->includeIcons($title);
13911785fc73SJames Collins
13921785fc73SJames Collins        return $title;
13931785fc73SJames Collins    }
13941785fc73SJames Collins
1395ab45ba71SJames Collins
139675adba86SJames Collins    /**
1397a8eebd82SJames Collins     * Print or return hero block
139875adba86SJames Collins     *
13999cff245bSJames Collins     * @param   boolean $print Print content.
1400a8eebd82SJames Collins     * @return  string         contents of hero
140175adba86SJames Collins     */
14029cff245bSJames Collins    public function includeHero(bool $print = true)
140310b40067Snomadjimbob    {
1404a8eebd82SJames Collins        $html = '';
140547161538SJames Collins
14069cff245bSJames Collins        if ($this->getConf('heroTitle') === true) {
1407a8eebd82SJames Collins            $html .= '<div class="mikio-hero">';
1408f8039bf2SJames Collins            $html .= '<div class="mikio-container">';
1409a8eebd82SJames Collins            $html .= '<div class="mikio-hero-text">';
14103a385f2cSJames Collins            if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) {
14119cff245bSJames Collins                $html .= $this->includeYouAreHere(false);
14129cff245bSJames Collins            }
14133a385f2cSJames Collins            if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) {
14149cff245bSJames Collins                $html .= $this->includeBreadcrumbs(false);
14159cff245bSJames Collins            }
1416ab45ba71SJames Collins
1417a8eebd82SJames Collins            $html .= '<h1 class="mikio-hero-title">';
14181785fc73SJames Collins            $html .= $this->parsePageTitle();    // No idea why this requires a blank space afterwards to work?
1419a8eebd82SJames Collins            $html .= '</h1>';
1420a8eebd82SJames Collins            $html .= '<h2 class="mikio-hero-subtitle"></h2>';
1421a8eebd82SJames Collins            $html .= '</div>';
142247161538SJames Collins
14239cff245bSJames Collins            $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true));
1424a8eebd82SJames Collins            $hero_image_resize_class = '';
14253a385f2cSJames Collins            if (empty($hero_image) === false) {
1426a8eebd82SJames Collins                $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"';
1427a8eebd82SJames Collins                $hero_image_resize_class = ' mikio-hero-image-resize';
142847161538SJames Collins            }
1429a8eebd82SJames Collins
14309cff245bSJames Collins            $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image .
14319cff245bSJames Collins                '><div class="mikio-tags"></div></div>';
1432a8eebd82SJames Collins
1433a8eebd82SJames Collins            $html .= '</div>';
1434f8039bf2SJames Collins            $html .= '</div>';
14359cff245bSJames Collins        }//end if
14369cff245bSJames Collins
14379cff245bSJames Collins        if ($print === true) {
14389cff245bSJames Collins            echo $html;
143975adba86SJames Collins        }
1440a8eebd82SJames Collins
1441a8eebd82SJames Collins        return $html;
144275adba86SJames Collins    }
144375adba86SJames Collins
144475adba86SJames Collins
144575adba86SJames Collins    /**
1446a8eebd82SJames Collins     * Print or return out TOC
144775adba86SJames Collins     *
14489cff245bSJames Collins     * @param   boolean $print Print TOC.
14499cff245bSJames Collins     * @param   boolean $parse Parse icons.
1450a8eebd82SJames Collins     * @return  string         contents of TOC
145175adba86SJames Collins     */
14529cff245bSJames Collins    public function includeTOC(bool $print = true, bool $parse = true)
145310b40067Snomadjimbob    {
1454ab45ba71SJames Collins        $html = '';
14552b4583abSJames Collins
1456ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
1457ab45ba71SJames Collins
14583a385f2cSJames Collins        if (empty($tocHtml) === false) {
1459*f65a4e5eSJames Collins            $tocHtml = preg_replace(
1460*f65a4e5eSJames Collins                '/(<h3.+?toggle.+?>)(.+?)<\/h3>/',
1461*f65a4e5eSJames Collins                '$1' .
1462*f65a4e5eSJames Collins                $this->mikioInlineIcon('hamburger', 'hamburger') . '$2' .
1463*f65a4e5eSJames Collins                $this->mikioInlineIcon('down-arrow', 'down-arrow') . '</h3>',
1464*f65a4e5eSJames Collins                $tocHtml
1465*f65a4e5eSJames Collins            );
1466ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
1467a8eebd82SJames Collins            $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml);
1468ab45ba71SJames Collins
1469ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
1470ab45ba71SJames Collins            $html .= $tocHtml;
1471ab45ba71SJames Collins            $html .= '</div>';
14722b4583abSJames Collins        }
14732b4583abSJames Collins
14749cff245bSJames Collins        if ($parse === true) {
14759cff245bSJames Collins            $html = $this->includeIcons($html);
14769cff245bSJames Collins        }
14779cff245bSJames Collins
14789cff245bSJames Collins        if ($print === true) {
1479ab45ba71SJames Collins            echo $html;
1480ab45ba71SJames Collins        }
1481ab45ba71SJames Collins
14829cff245bSJames Collins        return $html;
14839cff245bSJames Collins    }
14849cff245bSJames Collins
1485ab45ba71SJames Collins
1486a8eebd82SJames Collins    /**
1487ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
1488ab45ba71SJames Collins     *
14899cff245bSJames Collins     * @param   string $str Content to parse.
1490ab45ba71SJames Collins     * @return  string      parsed string
1491ab45ba71SJames Collins     */
14929cff245bSJames Collins    public function includeIcons(string $str)
149310b40067Snomadjimbob    {
1494ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
1495ab45ba71SJames Collins
1496ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
14973a385f2cSJames Collins        if (empty($iconTag) === true) {
14989cff245bSJames Collins            return $str;
14999cff245bSJames Collins        }
1500ab45ba71SJames Collins
15019cff245bSJames Collins        if (
15029cff245bSJames Collins            in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true ||
15033a385f2cSJames Collins            strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0
15049cff245bSJames Collins        ) {
1505a2005a27SJames Collins            $content = $str;
1506a2005a27SJames Collins            $preview = null;
1507a2005a27SJames Collins
15083a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15099cff245bSJames Collins                $html = new \simple_html_dom();
1510a2005a27SJames Collins                $html->stripRNAttrValues = false;
1511a2005a27SJames Collins                $html->load($str, true, false);
1512a2005a27SJames Collins
1513a2005a27SJames Collins                $preview = $html->find('div.preview');
15149cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1515a2005a27SJames Collins                    $content = $preview[0]->innertext;
1516a2005a27SJames Collins                }
1517a2005a27SJames Collins            }
1518a2005a27SJames Collins
15191785fc73SJames Collins            $page_regex = '/(.*)/';
15209cff245bSJames Collins            if (stripos($str, '<pre') !== false) {
15211785fc73SJames Collins                $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/';
15221785fc73SJames Collins            }
15231785fc73SJames Collins
15241785fc73SJames Collins            $content = preg_replace_callback($page_regex, function ($icons) {
1525a2005a27SJames Collins                $iconTag = $this->getConf('iconTag', 'icon');
1526a2005a27SJames Collins
152710b40067Snomadjimbob                return preg_replace_callback(
152810b40067Snomadjimbob                    '/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
1529ab45ba71SJames Collins                    function ($matches) {
1530ab45ba71SJames Collins                        global $MIKIO_ICONS;
1531ab45ba71SJames Collins
1532ab45ba71SJames Collins                        $s = $matches[0];
1533ab45ba71SJames Collins
1534ab45ba71SJames Collins                        if (count($MIKIO_ICONS) > 0) {
1535ab45ba71SJames Collins                            $icon = $MIKIO_ICONS[0];
1536ab45ba71SJames Collins
1537ab45ba71SJames Collins                            if (count($matches) > 1) {
1538ab45ba71SJames Collins                                $e = explode(' ', $matches[1]);
1539ab45ba71SJames Collins
1540ab45ba71SJames Collins                                if (count($e) > 1) {
1541ab45ba71SJames Collins                                    foreach ($MIKIO_ICONS as $iconItem) {
15429cff245bSJames Collins                                        if (strcasecmp($iconItem['name'], $e[0]) === 0) {
1543ab45ba71SJames Collins                                            $icon = $iconItem;
1544ab45ba71SJames Collins
1545ab45ba71SJames Collins                                            $s = $icon['insert'];
1546ab45ba71SJames Collins                                            for ($i = 1; $i < 9; $i++) {
15471cdedf28SJames Collins                                                if (count($e) < $i || empty($e[$i]) === true) {
15489cff245bSJames Collins                                                    if (isset($icon['$' . $i]) === true) {
1549ab45ba71SJames Collins                                                        $s = str_replace('$' . $i, $icon['$' . $i], $s);
1550ab45ba71SJames Collins                                                    }
1551ab45ba71SJames Collins                                                } else {
1552ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $e[$i], $s);
1553ab45ba71SJames Collins                                                }
1554ab45ba71SJames Collins                                            }
1555ab45ba71SJames Collins
1556ab45ba71SJames Collins                                            $dir = '';
15579cff245bSJames Collins                                            if (isset($icon['dir']) === true) {
15589cff245bSJames Collins                                                $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
15599cff245bSJames Collins                                            }
1560ab45ba71SJames Collins
1561ab45ba71SJames Collins                                            $s = str_replace('$0', $dir, $s);
1562ab45ba71SJames Collins
1563ab45ba71SJames Collins                                            break;
15649cff245bSJames Collins                                        }//end if
15659cff245bSJames Collins                                    }//end foreach
1566ab45ba71SJames Collins                                } else {
1567ab45ba71SJames Collins                                    $s = str_replace('$1', $matches[1], $icon['insert']);
15689cff245bSJames Collins                                }//end if
15699cff245bSJames Collins                            }//end if
15709cff245bSJames Collins                        }//end if
157175adba86SJames Collins
1572ab45ba71SJames Collins                        $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
15739cff245bSJames Collins                        if ($count === 0) {
1574ab45ba71SJames Collins                            $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
1575ab45ba71SJames Collins                        }
1576ab45ba71SJames Collins
1577ab45ba71SJames Collins                        return $s;
1578ab45ba71SJames Collins                    },
157910b40067Snomadjimbob                    $icons[0]
158010b40067Snomadjimbob                );
1581a2005a27SJames Collins            }, $content);
1582a2005a27SJames Collins
15833a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15849cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1585a2005a27SJames Collins                    $preview[0]->innertext = $content;
1586a2005a27SJames Collins                }
1587a2005a27SJames Collins
1588a2005a27SJames Collins                $str = $html->save();
1589a2005a27SJames Collins                $html->clear();
1590a2005a27SJames Collins                unset($html);
1591a2005a27SJames Collins            } else {
1592a2005a27SJames Collins                $str = $content;
1593a2005a27SJames Collins            }
15949cff245bSJames Collins        }//end if
1595ab45ba71SJames Collins
1596ab45ba71SJames Collins        return $str;
1597ab45ba71SJames Collins    }
159847161538SJames Collins
1599c165b184SJames Collins    /**
1600a8eebd82SJames Collins     * Parse HTML for theme
1601c165b184SJames Collins     *
16029cff245bSJames Collins     * @param   string $content HTML content to parse.
1603a8eebd82SJames Collins     * @return  string          Parsed content
1604c165b184SJames Collins     */
16059cff245bSJames Collins    public function parseContent(string $content)
160610b40067Snomadjimbob    {
1607ab45ba71SJames Collins        global $INPUT, $ACT;
1608ab45ba71SJames Collins
1609a8eebd82SJames Collins        // Add Mikio Section titles
16103a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
16119cff245bSJames Collins            $admin_sections = [
1612ab45ba71SJames Collins                // Section      Insert Before                 Icon
16139cff245bSJames Collins                'navbar'        => ['navbarUseTitleIcon',      ''],
16149cff245bSJames Collins                'search'        => ['searchButton',            ''],
16159cff245bSJames Collins                'hero'          => ['heroTitle',               ''],
16169cff245bSJames Collins                'tags'          => ['tagsConsolidate',         ''],
16179cff245bSJames Collins                'breadcrumb'    => ['breadcrumbHideHome',      ''],
16189cff245bSJames Collins                'youarehere'    => ['youarehereHideHome',      ''],
16199cff245bSJames Collins                'sidebar'       => ['sidebarShowLeft',         ''],
16209cff245bSJames Collins                'toc'           => ['tocFull',                 ''],
16219cff245bSJames Collins                'pagetools'     => ['pageToolsFloating',       ''],
16229cff245bSJames Collins                'footer'        => ['footerCustomMenuText',    ''],
16239cff245bSJames Collins                'license'       => ['licenseType',             ''],
16249cff245bSJames Collins                'acl'           => ['includePageUseACL',       ''],
16259cff245bSJames Collins                'sticky'        => ['stickyTopHeader',         ''],
16269cff245bSJames Collins            ];
1627ab45ba71SJames Collins
1628ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
1629ab45ba71SJames Collins                $search = $items[0];
1630ab45ba71SJames Collins                $icon   = $items[1];
1631ab45ba71SJames Collins
163210b40067Snomadjimbob                $content = preg_replace(
1633adf52ebbSJames Collins                    '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/',
16349cff245bSJames Collins                    '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) .
16359cff245bSJames Collins                        tpl_getLang('config_' . $section) .
16369cff245bSJames Collins                        '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' .
16379cff245bSJames Collins                        $search . '</span>',
163810b40067Snomadjimbob                    $content
163910b40067Snomadjimbob                );
1640ab45ba71SJames Collins            }
1641bb5a3dd1SJames Collins        } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) {
1642cee81679SJames Collins            $style_headers = [
1643*f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__text_'],
1644*f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__code_'],
1645*f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__control_'],
1646*f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__topheader_'],
1647*f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__navbar_'],
1648*f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar_'],
1649*f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__tag_background_color_'],
1650*f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb_'],
1651*f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__hero_'],
1652*f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__sidebar_'],
1653*f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__content_'],
1654*f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__toc_'],
1655*f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__pagetools_'],
1656*f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__footer_'],
1657*f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__table_'],
1658*f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__dropdown_'],
1659*f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__section_edit_'],
1660*f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__tree_'],
1661*f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__tab_'],
1662cee81679SJames Collins                ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'],
1663*f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__darkmode_text_'],
1664*f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__darkmode_code_'],
1665*f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__darkmode_control_'],
1666*f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__darkmode_topheader_'],
1667*f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar_'],
1668*f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar_'],
1669*f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color_'],
1670*f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb_'],
1671*f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__darkmode_hero_'],
1672*f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar_'],
1673*f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__darkmode_content_'],
1674*f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__darkmode_toc_'],
1675*f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools_'],
1676*f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__darkmode_footer_'],
1677*f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__darkmode_table_'],
1678*f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown_'],
1679*f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit_'],
1680*f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__darkmode_tree_'],
1681*f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__darkmode_tab_'],
1682cee81679SJames Collins            ];
1683cee81679SJames Collins
1684cee81679SJames Collins            foreach ($style_headers as $header) {
1685cee81679SJames Collins                if (array_key_exists('heading', $header) === false) {
1686cee81679SJames Collins                    $header['heading'] = 'h3';
1687cee81679SJames Collins                }
1688cee81679SJames Collins
16891244e3ceSJames Collins                $content = preg_replace(
1690*f65a4e5eSJames Collins                    '/(<tr>\s*<td>\s*<label for="tpl__' . $header['starts_with'] . '.+?<\/tr>)/s',
1691906e1a13SJames Collins                    '</tbody></table><' . $header['heading'] . '>' . $header['title'] . '</' . $header['heading'] . '>
1692906e1a13SJames Collins                    <table><tbody>$1',
16931244e3ceSJames Collins                    $content,
16941244e3ceSJames Collins                    1
16951244e3ceSJames Collins                );
1696cee81679SJames Collins            }
1697*f65a4e5eSJames Collins
1698*f65a4e5eSJames Collins            $content = preg_replace('/type="color"/', 'type="text"', $content);
1699bb5a3dd1SJames Collins        }//end if
1700ab45ba71SJames Collins
17013a385f2cSJames Collins        if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
1702a8eebd82SJames Collins            $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content);
1703a8eebd82SJames Collins        }
1704ab45ba71SJames Collins
1705a8eebd82SJames Collins        // Page Revisions - Table Fix
17069cff245bSJames Collins        if (strpos($content, 'id="page__revisions"') !== false) {
17079cff245bSJames Collins            $content = preg_replace(
17089cff245bSJames Collins                '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/',
17099cff245bSJames Collins                '<span>$1</span>',
17109cff245bSJames Collins                $content
17119cff245bSJames Collins            );
1712a8eebd82SJames Collins        }
1713ab45ba71SJames Collins
17149cff245bSJames Collins        $html = new \simple_html_dom();
1715bc1032d9SJames Collins        $html->stripRNAttrValues = false;
1716c165b184SJames Collins        $html->load($content, true, false);
1717c165b184SJames Collins
17189cff245bSJames Collins        if ($html === false) {
17199cff245bSJames Collins            return $content;
17209cff245bSJames Collins        }
1721ab45ba71SJames Collins
1722ab45ba71SJames Collins        /* Buttons */
1723ab45ba71SJames Collins        foreach ($html->find('#config__manager button') as $node) {
1724ab45ba71SJames Collins            $c = explode(' ', $node->class);
17259cff245bSJames Collins            if (in_array('mikio-button', $c) === false) {
17269cff245bSJames Collins                $c[] = 'mikio-button';
17279cff245bSJames Collins            }
1728ab45ba71SJames Collins            $node->class = implode(' ', $c);
1729c165b184SJames Collins        }
1730c165b184SJames Collins
1731ab45ba71SJames Collins
1732ab45ba71SJames Collins        /* Buttons - Primary */
1733ab45ba71SJames Collins        foreach ($html->find('#config__manager [type=submit]') as $node) {
1734ab45ba71SJames Collins            $c = explode(' ', $node->class);
17359cff245bSJames Collins            if (in_array('mikio-primary', $c) === false) {
17369cff245bSJames Collins                $c[] = 'mikio-primary';
17379cff245bSJames Collins            }
1738ab45ba71SJames Collins            $node->class = implode(' ', $c);
1739ab45ba71SJames Collins        }
1740ab45ba71SJames Collins
1741a8eebd82SJames Collins        /* Hide page title if hero is enabled */
17429cff245bSJames Collins        if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
17431785fc73SJames Collins            $pageTitle = $this->parsePageTitle();
174447161538SJames Collins
174547161538SJames Collins            foreach ($html->find('h1,h2,h3,h4') as $elm) {
17469cff245bSJames Collins                if ($elm->innertext === $pageTitle) {
1747a8eebd82SJames Collins                    // $elm->innertext = '';
1748a8eebd82SJames Collins                    $elm->setAttribute('style', 'display:none');
1749a8eebd82SJames Collins
175047161538SJames Collins                    break;
175147161538SJames Collins                }
175247161538SJames Collins            }
175347161538SJames Collins        }
1754c165b184SJames Collins
1755a8eebd82SJames Collins        /* Hero subtitle */
17562b4583abSJames Collins        foreach ($html->find('p') as $elm) {
17572b4583abSJames Collins            $i = stripos($elm->innertext, '~~hero-subtitle');
17582b4583abSJames Collins            if ($i !== false) {
17599cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
17602b4583abSJames Collins                if ($j !== false) {
17619cff245bSJames Collins                    if ($j > ($i + 16)) {
17629cff245bSJames Collins                        $subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16));
1763a8eebd82SJames Collins                        $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
1764a8eebd82SJames Collins
1765a8eebd82SJames Collins                        // $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2);
1766a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext);
17672b4583abSJames Collins                    }
17682b4583abSJames Collins
17692b4583abSJames Collins                    break;
17702b4583abSJames Collins                }
17712b4583abSJames Collins            }
17722b4583abSJames Collins        }
17732b4583abSJames Collins
1774a8eebd82SJames Collins        /* Hero image */
1775a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1776a8eebd82SJames Collins            $image = '';
1777a8eebd82SJames Collins            preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches);
1778a8eebd82SJames Collins            if (count($matches) > 0) {
1779a8eebd82SJames Collins                preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches);
1780a8eebd82SJames Collins                if (count($imageTagMatches) > 0) {
1781a8eebd82SJames Collins                    $image = $imageTagMatches[1];
1782a8eebd82SJames Collins                } else {
1783a8eebd82SJames Collins                    preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches);
1784a8eebd82SJames Collins                    if (count($imageTagMatches) > 0) {
1785a8eebd82SJames Collins                        $image = $imageTagMatches[1];
1786a8eebd82SJames Collins                    } else {
1787a8eebd82SJames Collins                        $image = strip_tags($matches[1]);
17889cff245bSJames Collins                        if (stripos($image, ':') === false) {
17899cff245bSJames Collins                            $image = str_replace(['{', '}'], '', $image);
1790a8eebd82SJames Collins                            $i = stripos($image, '?');
17919cff245bSJames Collins                            if ($i !== false) {
1792a8eebd82SJames Collins                                $image = substr($image, 0, $i);
1793c165b184SJames Collins                            }
1794c165b184SJames Collins
1795a8eebd82SJames Collins                            $image = ml($image, '', true, '', false);
1796ab45ba71SJames Collins                        }
1797ab45ba71SJames Collins                    }
1798ab45ba71SJames Collins                }
1799ab45ba71SJames Collins
1800a8eebd82SJames Collins                $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
1801a8eebd82SJames Collins
1802a8eebd82SJames Collins                $elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext);
18039cff245bSJames Collins            }//end if
18049cff245bSJames Collins        }//end foreach
1805ab45ba71SJames Collins
18069cff245bSJames Collins        /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
18079cff245bSJames Collins        [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
1808a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1809a8eebd82SJames Collins            $i = stripos($elm->innertext, '~~hero-colors');
1810a8eebd82SJames Collins            if ($i !== false) {
18119cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
1812a8eebd82SJames Collins                if ($j !== false) {
18139cff245bSJames Collins                    if ($j > ($i + 14)) {
18149cff245bSJames Collins                        $color = substr($elm->innertext, ($i + 14), ($j - $i - 14));
1815a8eebd82SJames Collins                        $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')';
1816ab45ba71SJames Collins
1817a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext);
1818ab45ba71SJames Collins                    }
1819ab45ba71SJames Collins
1820a8eebd82SJames Collins                    break;
1821ab45ba71SJames Collins                }
1822ab45ba71SJames Collins            }
1823ab45ba71SJames Collins        }
1824ab45ba71SJames Collins
182596ec8e1eSJames Collins        /* Hide parts - ~~hide-parts [parts]~~  */
182696ec8e1eSJames Collins        foreach ($html->find('p') as $elm) {
182796ec8e1eSJames Collins            $i = stripos($elm->innertext, '~~hide-parts');
182896ec8e1eSJames Collins            if ($i !== false) {
18299cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
183096ec8e1eSJames Collins                if ($j !== false) {
18319cff245bSJames Collins                    if ($j > ($i + 13)) {
18329cff245bSJames Collins                        $parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13)));
183396ec8e1eSJames Collins                        $script = '';
183496ec8e1eSJames Collins
183596ec8e1eSJames Collins                        foreach ($parts as $part) {
183696ec8e1eSJames Collins                            // $part = trim($part);
183796ec8e1eSJames Collins                            if (strlen($part) > 0) {
183896ec8e1eSJames Collins                                $script .= 'mikio.hidePart(\'' . $part . '\');';
183996ec8e1eSJames Collins                            }
184096ec8e1eSJames Collins                        }
184196ec8e1eSJames Collins
184296ec8e1eSJames Collins                        if (strlen($script) > 0) {
184396ec8e1eSJames Collins                            $this->footerScript['hide-parts'] = $script;
184496ec8e1eSJames Collins                        }
184596ec8e1eSJames Collins
184696ec8e1eSJames Collins                        $elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext);
184796ec8e1eSJames Collins                    }
184896ec8e1eSJames Collins
184996ec8e1eSJames Collins                    break;
18509cff245bSJames Collins                }//end if
18519cff245bSJames Collins            }//end if
18529cff245bSJames Collins        }//end foreach
185396ec8e1eSJames Collins
185496ec8e1eSJames Collins
1855a8eebd82SJames Collins        /* Page Tags (tag plugin) */
18569cff245bSJames Collins        if ($this->getConf('tagsConsolidate') === true) {
1857a8eebd82SJames Collins            $tags = '';
1858a8eebd82SJames Collins            foreach ($html->find('div.tags a') as $elm) {
1859a8eebd82SJames Collins                $tags .= $elm->outertext;
1860a8eebd82SJames Collins            }
1861a8eebd82SJames Collins
1862a8eebd82SJames Collins            foreach ($html->find('div.tags') as $elm) {
1863a8eebd82SJames Collins                $elm->innertext = '';
1864a8eebd82SJames Collins                $elm->setAttribute('style', 'display:none');
1865a8eebd82SJames Collins            }
1866a8eebd82SJames Collins
18673a385f2cSJames Collins            if (empty($tags) === false) {
1868a8eebd82SJames Collins                $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
1869a8eebd82SJames Collins            }
1870ab45ba71SJames Collins        }
1871ab45ba71SJames Collins
1872ab45ba71SJames Collins        // Configuration Manager
18733a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
1874ab45ba71SJames Collins            // Additional save buttons
1875ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
1876ab45ba71SJames Collins                $saveButtons = '';
1877ab45ba71SJames Collins
1878ab45ba71SJames Collins                foreach ($cm->find('p') as $elm) {
1879ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
1880a8eebd82SJames Collins                    $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons);
1881ab45ba71SJames Collins                    $elm->outertext = '';
1882ab45ba71SJames Collins                }
1883ab45ba71SJames Collins
1884ab45ba71SJames Collins                foreach ($cm->find('fieldset') as $elm) {
1885ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
1886ab45ba71SJames Collins                }
1887ab45ba71SJames Collins            }
1888ab45ba71SJames Collins        }
1889ab45ba71SJames Collins
1890ab45ba71SJames Collins        $content = $html->save();
1891c165b184SJames Collins        $html->clear();
1892c165b184SJames Collins        unset($html);
1893c165b184SJames Collins
1894c165b184SJames Collins        return $content;
1895c165b184SJames Collins    }
18962b4583abSJames Collins
18972b4583abSJames Collins
1898a8eebd82SJames Collins    /**
1899a8eebd82SJames Collins     * Get DokuWiki namespace/page/URI as link
1900a8eebd82SJames Collins     *
19019cff245bSJames Collins     * @param   string $str String to parse.
19029cff245bSJames Collins     * @return  string      parsed URI
1903a8eebd82SJames Collins     */
19049cff245bSJames Collins    public function getLink(string $str)
190510b40067Snomadjimbob    {
19062b4583abSJames Collins        $i = strpos($str, '://');
19079cff245bSJames Collins        if ($i !== false) {
19089cff245bSJames Collins            return $str;
19099cff245bSJames Collins        }
19102b4583abSJames Collins
19112b4583abSJames Collins        return wl($str);
19122b4583abSJames Collins    }
1913ab45ba71SJames Collins
1914ab45ba71SJames Collins
1915a8eebd82SJames Collins    /**
1916a8eebd82SJames Collins     * Check if the user can edit current namespace/page
1917a8eebd82SJames Collins     *
1918a8eebd82SJames Collins     * @return  boolean  user can edit
1919a8eebd82SJames Collins     */
192010b40067Snomadjimbob    public function userCanEdit()
192110b40067Snomadjimbob    {
1922ab45ba71SJames Collins        global $INFO;
1923ab45ba71SJames Collins        global $ID;
1924ab45ba71SJames Collins
1925ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
19269cff245bSJames Collins        if (@file_exists($wiki_file) === false) {
19279cff245bSJames Collins            return true;
19289cff245bSJames Collins        }
19299cff245bSJames Collins        if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
19309cff245bSJames Collins            return true;
19319cff245bSJames Collins        }
1932a8eebd82SJames Collins        // $meta_file = metaFN($ID, '.meta');
19339cff245bSJames Collins        if ($INFO['meta']['user'] === false) {
19349cff245bSJames Collins            return true;
19359cff245bSJames Collins        }
19369cff245bSJames Collins        if ($INFO['client'] === $INFO['meta']['user']) {
19379cff245bSJames Collins            return true;
19389cff245bSJames Collins        }
1939ab45ba71SJames Collins
1940ab45ba71SJames Collins        return false;
1941c165b184SJames Collins    }
194247161538SJames Collins
194347161538SJames Collins
1944a8eebd82SJames Collins    /**
1945a8eebd82SJames Collins     * Search for and return the uri of a media file
1946a8eebd82SJames Collins     *
19479cff245bSJames Collins     * @param string  $image           Image name to search for (without extension).
19489cff245bSJames Collins     * @param boolean $searchCurrentNS Search the current namespace.
19499cff245bSJames Collins     * @param boolean $propagate       Propagate search through the namespace.
19509cff245bSJames Collins     * @return string                  URI of the found media file
1951a8eebd82SJames Collins     */
19529cff245bSJames Collins    public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
195310b40067Snomadjimbob    {
1954ab45ba71SJames Collins        global $INFO;
1955a8eebd82SJames Collins
19569cff245bSJames Collins        $ext = ['png', 'jpg', 'gif', 'svg'];
1957ab45ba71SJames Collins
19589cff245bSJames Collins        if ($searchCurrentNS === true) {
19599cff245bSJames Collins            $prefix[] = ':' . $INFO['namespace'] . ':';
19609cff245bSJames Collins        }
19619cff245bSJames Collins        if ($propagate === true) {
1962ab45ba71SJames Collins            $prefix[] = ':';
1963ab45ba71SJames Collins            $prefix[] = ':wiki:';
1964a8eebd82SJames Collins        }
1965ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
19663a385f2cSJames Collins        if (empty($theme) === false) {
19679cff245bSJames Collins            $prefix[] = 'themes/' . $theme . '/images/';
19689cff245bSJames Collins        }
1969ab45ba71SJames Collins        $prefix[] = 'images/';
1970ab45ba71SJames Collins
19719cff245bSJames Collins        $search = [];
1972ab45ba71SJames Collins        foreach ($prefix as $pitem) {
1973ab45ba71SJames Collins            foreach ($ext as $eitem) {
1974ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
1975ab45ba71SJames Collins            }
1976ab45ba71SJames Collins        }
1977ab45ba71SJames Collins
1978ab45ba71SJames Collins        $img = '';
1979ab45ba71SJames Collins        $file = '';
1980ab45ba71SJames Collins        $url = '';
1981ab45ba71SJames Collins        $ismedia = false;
1982ab45ba71SJames Collins        $found = false;
1983ab45ba71SJames Collins
1984ab45ba71SJames Collins        foreach ($search as $img) {
19853a385f2cSJames Collins            if (strcasecmp(substr($img, 0, 1), ':') === 0) {
1986ab45ba71SJames Collins                $file    = mediaFN($img);
1987ab45ba71SJames Collins                $ismedia = true;
1988ab45ba71SJames Collins            } else {
1989ab45ba71SJames Collins                $file    = tpl_incdir() . $img;
1990ab45ba71SJames Collins                $ismedia = false;
1991ab45ba71SJames Collins            }
1992ab45ba71SJames Collins
19939cff245bSJames Collins            if (file_exists($file) === true) {
1994ab45ba71SJames Collins                $found = true;
1995ab45ba71SJames Collins                break;
1996ab45ba71SJames Collins            }
1997ab45ba71SJames Collins        }
1998ab45ba71SJames Collins
19999cff245bSJames Collins        if ($found === false) {
20009cff245bSJames Collins            return false;
20019cff245bSJames Collins        }
2002ab45ba71SJames Collins
20039cff245bSJames Collins        if ($ismedia === true) {
2004ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
2005ab45ba71SJames Collins        } else {
2006ab45ba71SJames Collins            $url = tpl_basedir() . $img;
2007ab45ba71SJames Collins        }
2008ab45ba71SJames Collins
2009ab45ba71SJames Collins        return $url;
2010ab45ba71SJames Collins    }
2011ab45ba71SJames Collins
2012a8eebd82SJames Collins
2013a8eebd82SJames Collins    /**
2014ab45ba71SJames Collins     * Print or return the page title
2015ab45ba71SJames Collins     *
20169cff245bSJames Collins     * @param string $page Page id or empty string for current page.
2017ab45ba71SJames Collins     * @return string      generated content
2018ab45ba71SJames Collins     */
20199cff245bSJames Collins    public function getPageTitle(string $page = '')
202010b40067Snomadjimbob    {
2021ab45ba71SJames Collins        global $ID, $conf;
2022ab45ba71SJames Collins
2023ab45ba71SJames Collins        $html = '';
2024ab45ba71SJames Collins
20253a385f2cSJames Collins        if (empty($page) === true) {
20269cff245bSJames Collins            $page = $ID;
20279cff245bSJames Collins        }
2028ab45ba71SJames Collins
2029ab45ba71SJames Collins        $html = p_get_first_heading($page);
2030ab45ba71SJames Collins        $html = strip_tags($html);
2031ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
2032ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
2033ab45ba71SJames Collins        $html = trim($html);
2034ab45ba71SJames Collins
2035ab45ba71SJames Collins        return $html;
2036ab45ba71SJames Collins    }
2037a8eebd82SJames Collins
2038a8eebd82SJames Collins
2039a8eebd82SJames Collins    /**
2040a8eebd82SJames Collins     * Return inline theme icon
2041a8eebd82SJames Collins     *
20429cff245bSJames Collins     * @param   string $type  Icon to retreive.
20439e41d878SJames Collins     * @param   string $class Classname to insert.
20449cff245bSJames Collins     * @return  string        HTML icon content
2045a8eebd82SJames Collins     */
20469e41d878SJames Collins    public function mikioInlineIcon(string $type, string $class = "")
204710b40067Snomadjimbob    {
20489e41d878SJames Collins        if (is_array($class) === true) {
20499e41d878SJames Collins            $class = explode(' ', $class);
20509e41d878SJames Collins        }
20519e41d878SJames Collins
20529e41d878SJames Collins        if (strlen($class) > 0) {
20539e41d878SJames Collins            $class = ' ' . $class;
20549e41d878SJames Collins        }
20559e41d878SJames Collins
2056a8eebd82SJames Collins        switch ($type) {
2057a8eebd82SJames Collins            case 'wrench':
2058906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792
2059906e1a13SJames 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,
2060906e1a13SJames 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,
2061906e1a13SJames 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,
2062906e1a13SJames 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
2063906e1a13SJames 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,
2064906e1a13SJames 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>';
2065a8eebd82SJames Collins            case 'file':
2066906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2067906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991">
2068906e1a13SJames 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
2069906e1a13SJames 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
2070906e1a13SJames 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"
20719cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
2072a8eebd82SJames Collins            case 'gear':
2073906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2074906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027">
2075906e1a13SJames 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
2076906e1a13SJames 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
2077906e1a13SJames 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
2078906e1a13SJames 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
2079906e1a13SJames 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
2080906e1a13SJames 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,
2081906e1a13SJames 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
2082906e1a13SJames 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
2083906e1a13SJames 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" />
2084906e1a13SJames Collins</g></svg>';
2085a8eebd82SJames Collins            case 'user':
2086906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2087906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M
2088906e1a13SJames 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
2089906e1a13SJames 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,
2090906e1a13SJames 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
2091906e1a13SJames 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
2092906e1a13SJames 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,
2093906e1a13SJames Collins1408 863,1408 975.5,1295.5 1088,1183 1088,1024 z"/></g></svg>';
2094a8eebd82SJames Collins            case 'search':
20959e41d878SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
20969cff245bSJames 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
20979cff245bSJames 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
20989cff245bSJames 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
20999cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>';
2100a8eebd82SJames Collins            case 'home':
2101906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2102906e1a13SJames CollinsviewBox="0 -256 1792 1792" aria-hidden="true" style="fill:currentColor"><g
2103906e1a13SJames 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
2104906e1a13SJames 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
2105906e1a13SJames 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
2106906e1a13SJames 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,
2107906e1a13SJames 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"
21089cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
21099e41d878SJames Collins            case 'sun':
2110906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2111906e1a13SJames 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
2112906e1a13SJames 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
2113906e1a13SJames 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
2114906e1a13SJames 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
2115906e1a13SJames Collins0 0 1-.707.707z" /></svg>';
21169e41d878SJames Collins            case 'moon':
2117906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2118906e1a13SJames 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
2119906e1a13SJames 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
2120906e1a13SJames 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
2121906e1a13SJames 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
2122906e1a13SJames Collins0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>';
2123*f65a4e5eSJames Collins            case 'hamburger':
2124*f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
2125*f65a4e5eSJames 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
2126*f65a4e5eSJames 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
2127*f65a4e5eSJames 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
2128*f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16z"/></svg>';
2129*f65a4e5eSJames Collins            case 'down-arrow':
2130*f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
2131*f65a4e5eSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M16.003 18.626l7.081-7.081L25 13.46l-8.997 8.998-9.003-9
2132*f65a4e5eSJames Collins1.917-1.916z"/></svg>';
21339cff245bSJames Collins        }//end switch
2134ab45ba71SJames Collins
2135a8eebd82SJames Collins        return '';
2136a8eebd82SJames Collins    }
2137ab45ba71SJames Collins
2138a8eebd82SJames Collins    /**
2139a8eebd82SJames Collins     * Finalize theme
21409cff245bSJames Collins     *
21419cff245bSJames Collins     * @return void
2142a8eebd82SJames Collins     */
214310b40067Snomadjimbob    public function finalize()
214410b40067Snomadjimbob    {
2145a8eebd82SJames Collins    }
21461785fc73SJames Collins
21471785fc73SJames Collins    /**
21481785fc73SJames Collins     * Show Messages
21499cff245bSJames Collins     *
21509cff245bSJames Collins     * @return void
21511785fc73SJames Collins     */
215210b40067Snomadjimbob    public function showMessages()
215310b40067Snomadjimbob    {
21541785fc73SJames Collins        global $ACT;
21551785fc73SJames Collins
21569cff245bSJames Collins        if ($this->lessIgnored === true) {
21579cff245bSJames Collins            msg(
21589cff245bSJames Collins                'useLESS is enabled on the Mikio template, however is not supported on this server',
21599cff245bSJames Collins                2,
21609cff245bSJames Collins                '',
21619cff245bSJames Collins                '',
21629cff245bSJames Collins                MSG_ADMINS_ONLY
21639cff245bSJames Collins            );
2164a8df40efSJames Collins        }
2165a8df40efSJames Collins
21661785fc73SJames Collins        $show = $this->getConf('showNotifications');
21673a385f2cSJames Collins        if (
21683a385f2cSJames Collins            strcasecmp($show, 'always') === 0 ||
21693a385f2cSJames Collins            (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
21703a385f2cSJames Collins        ) {
21711785fc73SJames Collins            global $MSG, $MSG_shown;
21721785fc73SJames Collins
21739cff245bSJames Collins            if (isset($MSG) === false) {
21741785fc73SJames Collins                return;
21751785fc73SJames Collins            }
21761785fc73SJames Collins
21779cff245bSJames Collins            if (isset($MSG_shown) === false) {
21789cff245bSJames Collins                $MSG_shown = [];
2179a8df40efSJames Collins            }
21801785fc73SJames Collins
21811785fc73SJames Collins            foreach ($MSG as $msg) {
21821785fc73SJames Collins                $hash = md5($msg['msg']);
21839cff245bSJames Collins                if (isset($MSG_shown[$hash]) === true) {
21841785fc73SJames Collins                    continue;
21851785fc73SJames Collins                }
21861785fc73SJames Collins                // skip double messages
21871785fc73SJames Collins
21889cff245bSJames Collins                if (info_msg_allowed($msg) === true) {
21899cff245bSJames Collins                    echo '<div class="' . $msg['lvl'] . '">';
21909cff245bSJames Collins                    echo $msg['msg'];
21919cff245bSJames Collins                    echo '</div>';
21921785fc73SJames Collins                }
21931785fc73SJames Collins
2194a8df40efSJames Collins                $MSG_shown[$hash] = true;
21951785fc73SJames Collins            }
21961785fc73SJames Collins
21971785fc73SJames Collins            unset($GLOBALS['MSG']);
21989cff245bSJames Collins        }//end if
21991785fc73SJames Collins    }
22007ac0a6efSJames Collins
22017ac0a6efSJames Collins    /**
22027ac0a6efSJames Collins     * Dokuwiki version
22037ac0a6efSJames Collins     *
22047ac0a6efSJames Collins     * @return  string        the dw version name
22057ac0a6efSJames Collins     */
22069cff245bSJames Collins    public function dwVersion()
22079cff245bSJames Collins    {
22089cff245bSJames Collins        if (function_exists('getVersionData') === true) {
22097ac0a6efSJames Collins            $version_data = getVersionData();
22109cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
22117ac0a6efSJames Collins                $version_items = explode(' ', $version_data['date']);
22127ac0a6efSJames Collins                if (count($version_items) >= 2) {
22137ac0a6efSJames Collins                    return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
22147ac0a6efSJames Collins                }
22157ac0a6efSJames Collins            }
22167ac0a6efSJames Collins        }
22177ac0a6efSJames Collins
22187ac0a6efSJames Collins        return 'unknown';
22197ac0a6efSJames Collins    }
2220e4c4fb13SJames Collins
2221e4c4fb13SJames Collins    /**
2222e4c4fb13SJames Collins     * Dokuwiki version number
2223e4c4fb13SJames Collins     *
2224e4c4fb13SJames Collins     * @return  string        the dw version date converted to integer
2225e4c4fb13SJames Collins     */
22269cff245bSJames Collins    public function dwVersionNumber()
22279cff245bSJames Collins    {
22289cff245bSJames Collins        if (function_exists('getVersionData') === true) {
2229e4c4fb13SJames Collins            $version_data = getVersionData();
22309cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
2231e4c4fb13SJames Collins                $version_items = explode(' ', $version_data['date']);
2232e4c4fb13SJames Collins                if (count($version_items) >= 1) {
2233e4c4fb13SJames Collins                    return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
2234e4c4fb13SJames Collins                }
2235e4c4fb13SJames Collins            }
2236e4c4fb13SJames Collins        }
2237e4c4fb13SJames Collins
2238e4c4fb13SJames Collins        return 0;
2239e4c4fb13SJames Collins    }
2240a8eebd82SJames Collins}
2241ab45ba71SJames Collins
2242ab45ba71SJames Collinsglobal $TEMPLATE;
224347161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
2244