xref: /template/mikio/mikio.php (revision 30b82348bafc9493f03435da3bdd3eeda529d793)
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) {
697*30b82348SJames Collins            $html .= '<li class="mikio-theme-mode">
698*30b82348SJames Collins<a href="#" class="mikio-control mikio-button mikio-theme-mode-button"></a></li>';
69912030b10SJames Collins        }
70012030b10SJames Collins
701ab45ba71SJames Collins        $html .= '</ul>';
702ab45ba71SJames Collins
7039cff245bSJames Collins        if ($print === true) {
7049cff245bSJames Collins            echo $html;
7059cff245bSJames Collins        }
706a8eebd82SJames Collins        return $html;
707a8eebd82SJames Collins    }
708a8eebd82SJames Collins
709a8eebd82SJames Collins
710a8eebd82SJames Collins    /**
711a8eebd82SJames Collins     * Create a nav element from a string. <uri>|<title>;
712a8eebd82SJames Collins     *
7139cff245bSJames Collins     * @param string $str String to generate nav.
714a8eebd82SJames Collins     * @return string     nav elements generated
715a8eebd82SJames Collins     */
7169cff245bSJames Collins    public function stringToNav(string $str)
71710b40067Snomadjimbob    {
718a8eebd82SJames Collins        $html = '';
719a8eebd82SJames Collins
7203a385f2cSJames Collins        if (empty($str) === false) {
721a8eebd82SJames Collins            $items = explode(';', $str);
722a8eebd82SJames Collins            if (count($items) > 0) {
723a8eebd82SJames Collins                $html .= '<ul class="mikio-nav">';
724a8eebd82SJames Collins                foreach ($items as $item) {
725a8eebd82SJames Collins                    $parts = explode('|', $item);
726a8eebd82SJames Collins                    if ($parts > 1) {
7279cff245bSJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' .
7289cff245bSJames Collins                            strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) .
7299cff245bSJames Collins                            '</a></li>';
730a8eebd82SJames Collins                    }
731a8eebd82SJames Collins                }
732a8eebd82SJames Collins                $html .= '</ul>';
733a8eebd82SJames Collins            }
7342b4583abSJames Collins        }
7352b4583abSJames Collins
736ab45ba71SJames Collins        return $html;
7372b4583abSJames Collins    }
7382b4583abSJames Collins
739a8eebd82SJames Collins    /**
740ab45ba71SJames Collins     * print or return the main navbar
7412b4583abSJames Collins     *
7429cff245bSJames Collins     * @param boolean $print   Print the navbar.
7439cff245bSJames Collins     * @param boolean $showSub Include the sub navbar.
744ab45ba71SJames Collins     * @return string          generated content
7452b4583abSJames Collins     */
7469cff245bSJames Collins    public function includeNavbar(bool $print = true, bool $showSub = false)
74710b40067Snomadjimbob    {
748b39ad16dSJames Collins        global $conf, $USERINFO;
749d3d7d2b7SJames Collins
750d3d7d2b7SJames Collins        $homeUrl = wl();
751d3d7d2b7SJames Collins
7529cff245bSJames Collins        if (plugin_isdisabled('showpageafterlogin') === false) {
753d3d7d2b7SJames Collins            $p = &plugin_load('action', 'showpageafterlogin');
7543a385f2cSJames Collins            if (empty($p) === false) {
7559cff245bSJames Collins                if (is_array($USERINFO) === true && count($USERINFO) > 0) {
756d3d7d2b7SJames Collins                    $homeUrl = wl($p->getConf('page_after_login'));
757d3d7d2b7SJames Collins                }
758d3d7d2b7SJames Collins            }
759b39ad16dSJames Collins        } else {
7609cff245bSJames Collins            if (is_array($USERINFO) === true && count($USERINFO) > 0) {
761b39ad16dSJames Collins                $url = $this->getConf('brandURLUser');
762b39ad16dSJames Collins                if (strlen($url) > 0) {
763b39ad16dSJames Collins                    $homeUrl = $url;
764d3d7d2b7SJames Collins                }
765b39ad16dSJames Collins            } else {
766b39ad16dSJames Collins                $url = $this->getConf('brandURLGuest');
767b39ad16dSJames Collins                if (strlen($url) > 0) {
768b39ad16dSJames Collins                    $homeUrl = $url;
769b39ad16dSJames Collins                }
770b39ad16dSJames Collins            }
771b39ad16dSJames Collins        }
772d3d7d2b7SJames Collins
773ab45ba71SJames Collins        $html = '';
77447161538SJames Collins
7759cff245bSJames Collins        $html .= '<nav class="mikio-navbar'  . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') .
7769cff245bSJames Collins            '">';
777f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
778d3d7d2b7SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">';
7799cff245bSJames Collins        if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) {
780ab45ba71SJames Collins            // Brand image
7819cff245bSJames Collins            if ($this->getConf('navbarUseTitleIcon') === true) {
7829cff245bSJames Collins                $logo = $this->getMediaFile('logo', false);
7839cff245bSJames Collins                ;
7843a385f2cSJames Collins                if (empty($logo) === false) {
785f0241fc4SJames Collins                    $width = $this->getConf('navbarTitleIconWidth');
786f0241fc4SJames Collins                    $height = $this->getConf('navbarTitleIconHeight');
787f0241fc4SJames Collins                    $styles = '';
788f0241fc4SJames Collins
789f0241fc4SJames Collins                    if (strlen($width) > 0 || strlen($height) > 0) {
7909cff245bSJames Collins                        if (ctype_digit($width) === true) {
791f0241fc4SJames Collins                            $styles .= 'max-width:' . intval($width) . 'px;';
7929cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) {
793f0241fc4SJames Collins                            $styles .= 'max-width:' . $width . ';';
7949cff245bSJames Collins                        } elseif (strcasecmp($width, 'none') === 0) {
7957a92c19bSJames Collins                            $styles .= 'max-width:none;';
796f0241fc4SJames Collins                        }
797f0241fc4SJames Collins
7989cff245bSJames Collins                        if (ctype_digit($height) === true) {
799f0241fc4SJames Collins                            $styles .= 'max-height:' . intval($height) . 'px;';
8009cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) {
801f0241fc4SJames Collins                            $styles .= 'max-height:' . $height . ';';
8029cff245bSJames Collins                        } elseif (strcasecmp($height, 'none') === 0) {
8037a92c19bSJames Collins                            $styles .= 'max-height:none;';
804f0241fc4SJames Collins                        }
805f0241fc4SJames Collins
806f0241fc4SJames Collins                        if (strlen($styles) > 0) {
807f0241fc4SJames Collins                            $styles = ' style="' . $styles . '"';
808f0241fc4SJames Collins                        }
8099cff245bSJames Collins                    }//end if
810f0241fc4SJames Collins
811f0241fc4SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>';
8129cff245bSJames Collins                }//end if
8139cff245bSJames Collins            }//end if
814ab45ba71SJames Collins
815ab45ba71SJames Collins            // Brand title
8169cff245bSJames Collins            if ($this->getConf('navbarUseTitleText') === true) {
817ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
818a8eebd82SJames Collins                $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>';
8199cff245bSJames Collins                if ($this->getConf('navbarUseTaglineText') === true) {
820a8eebd82SJames Collins                    $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>';
821ab45ba71SJames Collins                }
822ab45ba71SJames Collins                $html .= '</div>';
823ab45ba71SJames Collins            }
8249cff245bSJames Collins        }//end if
825ab45ba71SJames Collins        $html .= '</a>';
826660b2c71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>';
827ab45ba71SJames Collins
828ab45ba71SJames Collins        // Menus
829ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
830ab45ba71SJames Collins
8319cff245bSJames Collins        $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'),
8329cff245bSJames Collins            $this->getConf('navbarPosRight', 'none')
8339cff245bSJames Collins        ];
834a8eebd82SJames Collins        foreach ($menus as $menuType) {
835a8eebd82SJames Collins            switch ($menuType) {
836a8eebd82SJames Collins                case 'custom':
837a8eebd82SJames Collins                    $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', ''));
838a8eebd82SJames Collins                    break;
839a8eebd82SJames Collins                case 'search':
840ab45ba71SJames Collins                    $html .= '<div class="mikio-nav-item">';
841ab45ba71SJames Collins                    $html .= $this->includeSearch(false);
842ab45ba71SJames Collins                    $html .= '</div>';
843a8eebd82SJames Collins                    break;
844a8eebd82SJames Collins                case 'dokuwiki':
8459cff245bSJames Collins                    $html .= $this->includeDWMenu(false);
846a8eebd82SJames Collins                    break;
847a8eebd82SJames Collins            }
848a8eebd82SJames Collins        }
849ab45ba71SJames Collins
850ab45ba71SJames Collins        $html .= '</div>';
851f8039bf2SJames Collins        $html .= '</div>';
852ab45ba71SJames Collins        $html .= '</nav>';
853ab45ba71SJames Collins
854a8eebd82SJames Collins        // Sub Navbar
8559cff245bSJames Collins        if ($showSub === true) {
8569cff245bSJames Collins            $sub = $this->includePage('submenu', false);
8573a385f2cSJames Collins            if (empty($sub) === false) {
8589cff245bSJames Collins                $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>';
8599cff245bSJames Collins            }
860ab45ba71SJames Collins        }
861ab45ba71SJames Collins
8629cff245bSJames Collins        if ($print === true) {
8639cff245bSJames Collins            echo $html;
8649cff245bSJames Collins        }
865ab45ba71SJames Collins        return $html;
866ab45ba71SJames Collins    }
867ab45ba71SJames Collins
868ab45ba71SJames Collins
869a8eebd82SJames Collins    /**
870a8eebd82SJames Collins     * Is there a sidebar
871a8eebd82SJames Collins     *
8729cff245bSJames Collins     * @param   string $prefix Sidebar prefix to use when searching.
873a8eebd82SJames Collins     * @return  boolean        if sidebar exists
874a8eebd82SJames Collins     */
8759cff245bSJames Collins    public function sidebarExists(string $prefix = '')
87610b40067Snomadjimbob    {
877a8eebd82SJames Collins        global $conf;
878a8eebd82SJames Collins
8793a385f2cSJames Collins        if (strcasecmp($prefix, 'left') === 0) {
8809cff245bSJames Collins            $prefix = '';
8819cff245bSJames Collins        }
882a8eebd82SJames Collins
883a8eebd82SJames Collins        return $this->pageExists($conf['sidebar' . $prefix]);
884a8eebd82SJames Collins    }
885a8eebd82SJames Collins
886a8eebd82SJames Collins
887a8eebd82SJames Collins    /**
888ab45ba71SJames Collins     * Print or return the sidebar content
889ab45ba71SJames Collins     *
8909cff245bSJames Collins     * @param   string  $prefix Sidebar prefix to use when searching.
8919cff245bSJames Collins     * @param   boolean $print  Print the generated content to the output buffer.
8929cff245bSJames Collins     * @param   boolean $parse  Parse the content.
893ab45ba71SJames Collins     * @return  string          generated content
894ab45ba71SJames Collins     */
8959cff245bSJames Collins    public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true)
89610b40067Snomadjimbob    {
897ab45ba71SJames Collins        global $conf, $ID;
898ab45ba71SJames Collins
899ab45ba71SJames Collins        $html = '';
900ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
901ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
902ab45ba71SJames Collins
9033a385f2cSJames Collins        if (empty($confPrefix) === true) {
9049cff245bSJames Collins            $confPrefix = 'Left';
9059cff245bSJames Collins        }
9063a385f2cSJames Collins        if (strcasecmp($prefix, 'Left') === 0) {
9079cff245bSJames Collins            $prefix = '';
9089cff245bSJames Collins        }
909ab45ba71SJames Collins
9103a385f2cSJames Collins        empty($sidebarPage = $conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar'];
911ab45ba71SJames Collins
9129cff245bSJames Collins        if (
9139cff245bSJames Collins            $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false &&
9149cff245bSJames Collins            p_get_metadata($ID, 'nosidebar', false) === false
9159cff245bSJames Collins        ) {
9169cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'header', false);
9173a385f2cSJames Collins            if (empty($content) === false) {
9189cff245bSJames Collins                $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
9199cff245bSJames Collins            }
920ab45ba71SJames Collins
9213a385f2cSJames Collins            if (empty($prefix) === true) {
9229cff245bSJames Collins                $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'),
9239cff245bSJames Collins                    $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4')
9249cff245bSJames Collins                ];
925ab45ba71SJames Collins
926a8eebd82SJames Collins                foreach ($rows as $row) {
927a8eebd82SJames Collins                    switch ($row) {
928a8eebd82SJames Collins                        case 'search':
9299cff245bSJames Collins                            $html .= $this->includeSearch(false);
930a8eebd82SJames Collins                            break;
931a8eebd82SJames Collins                        case 'logged in user':
9329cff245bSJames Collins                            $html .= $this->includeLoggedIn(false);
933a8eebd82SJames Collins                            break;
934a8eebd82SJames Collins                        case 'content':
9359cff245bSJames Collins                            $content = $this->includePage($sidebarPage, false);
9363a385f2cSJames Collins                            if (empty($content) === false) {
9379cff245bSJames Collins                                $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9389cff245bSJames Collins                            }
939a8eebd82SJames Collins                            break;
940a8eebd82SJames Collins                        case 'tags':
941a8eebd82SJames Collins                            $html .= '<div class="mikio-tags"></div>';
942a8eebd82SJames Collins                    }
943a8eebd82SJames Collins                }
944a8eebd82SJames Collins            } else {
9459cff245bSJames Collins                $content = $this->includePage($sidebarPage, false);
9463a385f2cSJames Collins                if (empty($content) === false) {
9479cff245bSJames Collins                    $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9489cff245bSJames Collins                }
9499cff245bSJames Collins            }//end if
9509cff245bSJames Collins
9519cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'footer', false);
9523a385f2cSJames Collins            if (empty($content) === false) {
9539cff245bSJames Collins                $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
9549cff245bSJames Collins            }
9559cff245bSJames Collins        }//end if
9569cff245bSJames Collins
9573a385f2cSJames Collins        if (empty($html) === true) {
9583a385f2cSJames Collins            if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) {
9599cff245bSJames Collins                $html = '&nbsp;';
9609cff245bSJames Collins            }
9619cff245bSJames Collins            if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) {
9629cff245bSJames Collins                $html = '&nbsp;';
9639cff245bSJames Collins            }
964a8eebd82SJames Collins        }
965ab45ba71SJames Collins
9663a385f2cSJames Collins        if (empty($html) === false) {
9673a385f2cSJames Collins            empty($html = '<aside class="mikio-sidebar mikio-sidebar-' . ($prefix) === true ? 'left' : $prefix) .
9689cff245bSJames Collins                '"><a class="mikio-sidebar-toggle' .
9699cff245bSJames Collins                ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' .
9709cff245bSJames Collins                tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' .
9719cff245bSJames Collins                $html . '</div></aside>';
972ab45ba71SJames Collins        }
973ab45ba71SJames Collins
9749cff245bSJames Collins        if ($parse === true) {
9759cff245bSJames Collins            $html = $this->includeIcons($html);
9763a04a100SJames Collins        }
9779cff245bSJames Collins        if ($print === true) {
9789cff245bSJames Collins            echo $html;
979ab45ba71SJames Collins        }
980ab45ba71SJames Collins        return $html;
981ab45ba71SJames Collins    }
982ab45ba71SJames Collins
983ab45ba71SJames Collins
984a8eebd82SJames Collins    /**
985ab45ba71SJames Collins     * Print or return the page tools content
986ab45ba71SJames Collins     *
9879cff245bSJames Collins     * @param   boolean $print     Print the generated content to the output buffer.
9889cff245bSJames Collins     * @param   boolean $includeId Include the dw__pagetools id in the element.
989ab45ba71SJames Collins     * @return  string             generated content
990ab45ba71SJames Collins     */
9919cff245bSJames Collins    public function includePageTools(bool $print = true, bool $includeId = false)
99210b40067Snomadjimbob    {
9931293ce10SJames Collins        global $USERINFO;
9941293ce10SJames Collins
9959cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
996ab45ba71SJames Collins        $html = '';
997ab45ba71SJames Collins
9989cff245bSJames Collins        $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
999b9c0582bSJames Collins        $html .= '<ul class="tools">';
1000ab45ba71SJames Collins
1001ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
1002ab45ba71SJames Collins        foreach ($items as $item) {
10039cff245bSJames Collins            $classes = [];
10043fd763a0SJames Collins            $classes[] = $item->getType();
10053fd763a0SJames Collins            $attr = $item->getLinkAttributes();
10063fd763a0SJames Collins
10079cff245bSJames Collins            if (empty($attr['class']) === false) {
10083fd763a0SJames Collins                $classes = array_merge($classes, explode(' ', $attr['class']));
1009ab45ba71SJames Collins            }
1010ab45ba71SJames Collins
10113fd763a0SJames Collins            $classes = array_unique($classes);
10123fd763a0SJames Collins
10131293ce10SJames Collins            $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()));
10149cff245bSJames Collins            if (
10153a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
10163a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
10173a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true))
10189cff245bSJames Collins            ) {
10193fd763a0SJames Collins                $html .= '<li class="' . implode(' ', $classes) . '">';
10209cff245bSJames Collins                $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' .
10219cff245bSJames Collins                    $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) .
10229cff245bSJames Collins                    '</div><span class="a11y">' . $item->getLabel() . '</span></a>';
10233fd763a0SJames Collins                $html .= '</li>';
10243fd763a0SJames Collins            }
10259cff245bSJames Collins        }//end foreach
10263fd763a0SJames Collins
10273fd763a0SJames Collins        $html .= '</ul>';
1028ab45ba71SJames Collins        $html .= '</nav>';
1029ab45ba71SJames Collins
10309cff245bSJames Collins        if ($print === true) {
10319cff245bSJames Collins            echo $html;
10329cff245bSJames Collins        }
1033ab45ba71SJames Collins        return $html;
1034ab45ba71SJames Collins    }
1035ab45ba71SJames Collins
1036ab45ba71SJames Collins
1037a8eebd82SJames Collins    /**
1038a8eebd82SJames Collins     * Print or return the search bar
1039a8eebd82SJames Collins     *
10409cff245bSJames Collins     * @param   boolean $print Print content.
1041a8eebd82SJames Collins     * @return  string         contents of the search bar
1042a8eebd82SJames Collins     */
10439cff245bSJames Collins    public function includeSearch(bool $print = true)
104410b40067Snomadjimbob    {
10459cff245bSJames Collins        global $lang, $ID, $ACT, $QUERY;
1046ab45ba71SJames Collins        $html = '';
1047ab45ba71SJames Collins
10489cff245bSJames Collins        $html .= '<form class="mikio-search search" action="' . wl() .
10499cff245bSJames Collins            '" accept-charset="utf-8" method="get" role="search">';
1050a8eebd82SJames Collins        $html .= '<input type="hidden" name="do" value="search">';
1051a8eebd82SJames Collins        $html .= '<input type="hidden" name="id" value="' . $ID . '">';
1052c1cb9f15SChris MacMackin        $html .= '<input name="q" ';
10539cff245bSJames Collins        if ($this->getConf('searchUseTypeahead') === true) {
1054c1cb9f15SChris MacMackin            $html .= 'class="search_typeahead" ';
1055c1cb9f15SChris MacMackin        }
10569cff245bSJames Collins        $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' .
10573a385f2cSJames Collins            ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
1058a8eebd82SJames Collins        $html .= '<button type="submit" title="' .  $lang['btn_search'] . '">';
10593a385f2cSJames Collins        if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) {
1060a8eebd82SJames Collins            $html .= $this->mikioInlineIcon('search');
1061ab45ba71SJames Collins        } else {
1062ab45ba71SJames Collins            $html .= $lang['btn_search'];
1063ab45ba71SJames Collins        }
1064ab45ba71SJames Collins        $html .= '</button>';
1065ab45ba71SJames Collins        $html .= '</form>';
1066ab45ba71SJames Collins
10679cff245bSJames Collins        if ($print === true) {
10689cff245bSJames Collins            echo $html;
10699cff245bSJames Collins        }
1070ab45ba71SJames Collins        return $html;
1071ab45ba71SJames Collins    }
1072ab45ba71SJames Collins
1073ab45ba71SJames Collins
1074a8eebd82SJames Collins    /**
1075a8eebd82SJames Collins     * Print or return content
1076a8eebd82SJames Collins     *
10779cff245bSJames Collins     * @param   boolean $print Print content.
1078a8eebd82SJames Collins     * @return  string         contents
1079a8eebd82SJames Collins     */
10809cff245bSJames Collins    public function includeContent(bool $print = true)
108110b40067Snomadjimbob    {
1082ab45ba71SJames Collins        ob_start();
10839cff245bSJames Collins        tpl_content(false);
1084ab45ba71SJames Collins        $html = ob_get_contents();
1085ab45ba71SJames Collins        ob_end_clean();
1086ab45ba71SJames Collins
1087ab45ba71SJames Collins        $html = $this->includeIcons($html);
1088ab45ba71SJames Collins        $html = $this->parseContent($html);
1089ab45ba71SJames Collins
1090ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
1091ab45ba71SJames Collins
10929cff245bSJames Collins        if ($this->getConf('heroTitle') === false) {
10939cff245bSJames Collins            $html = '<div class="mikio-tags"></div>' . $html;
10949cff245bSJames Collins        }
1095a8eebd82SJames Collins
1096a8eebd82SJames Collins        $html = '<div class="mikio-article-content">' . $html . '</div>';
1097a8eebd82SJames Collins
10989cff245bSJames Collins        if ($print === true) {
10999cff245bSJames Collins            echo $html;
11009cff245bSJames Collins        }
1101ab45ba71SJames Collins        return $html;
1102ab45ba71SJames Collins    }
1103ab45ba71SJames Collins
1104a8eebd82SJames Collins    /**
1105ab45ba71SJames Collins     * Print or return footer
1106ab45ba71SJames Collins     *
11079cff245bSJames Collins     * @param   boolean $print Print footer.
11089cff245bSJames Collins     * @return  string         HTML string containing footer
1109ab45ba71SJames Collins     */
11109cff245bSJames Collins    public function includeFooter(bool $print = true)
111110b40067Snomadjimbob    {
1112ab45ba71SJames Collins        global $ACT;
1113ab45ba71SJames Collins
1114ab45ba71SJames Collins        $html = '';
1115ab45ba71SJames Collins
1116ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
11179cff245bSJames Collins        $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>';
11189cff245bSJames Collins        $html .= $this->includePage('footer', false);
1119ab45ba71SJames Collins
1120a8eebd82SJames Collins        $html .= $this->stringToNav($this->getConf('footerCustomMenuText'));
1121ab45ba71SJames Collins
11229cff245bSJames Collins        if ($this->getConf('footerSearch') === true) {
1123ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
11249cff245bSJames Collins            $html .= $this->includeSearch(false);
1125ab45ba71SJames Collins            $html .= '</div>';
1126ab45ba71SJames Collins        }
1127ab45ba71SJames Collins
1128a8eebd82SJames Collins        $showPageTools = $this->getConf('pageToolsFooter');
11299cff245bSJames Collins        if (
11303a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 ||
11313a385f2cSJames Collins            $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0)
11329cff245bSJames Collins        ) {
11339cff245bSJames Collins            $html .= $this->includePageTools(false);
11349cff245bSJames Collins        }
1135ab45ba71SJames Collins
11369cff245bSJames Collins        $meta['licenseType']            = ['multichoice', '_choices' => ['none', 'badge', 'button']];
11379cff245bSJames Collins        $meta['licenseImageOnly']       = ['onoff'];
1138ab45ba71SJames Collins
1139ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
11409cff245bSJames Collins        if ($licenseType !== 'none') {
11419cff245bSJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true);
1142ab45ba71SJames Collins        }
1143ab45ba71SJames Collins
1144ab45ba71SJames Collins        $html .= '</footer>';
1145ab45ba71SJames Collins
11469cff245bSJames Collins        if ($print === true) {
11479cff245bSJames Collins            echo $html;
11489cff245bSJames Collins        }
1149ab45ba71SJames Collins        return $html;
1150ab45ba71SJames Collins    }
1151ab45ba71SJames Collins
1152ab45ba71SJames Collins
1153a8eebd82SJames Collins    /**
1154ab45ba71SJames Collins     * Print or return breadcrumb trail
1155ab45ba71SJames Collins     *
11569cff245bSJames Collins     * @param   boolean $print Print out trail.
11579cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
11589cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
1159ab45ba71SJames Collins     */
11609cff245bSJames Collins    public function includeBreadcrumbs(bool $print = true, bool $parse = true)
116110b40067Snomadjimbob    {
1162a8eebd82SJames Collins        global $conf, $ID, $lang, $ACT;
1163a8eebd82SJames Collins
11643a385f2cSJames Collins        if (
11653a385f2cSJames Collins            $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 &&
116695372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0
11673a385f2cSJames Collins        ) {
11689cff245bSJames Collins            return '';
11699cff245bSJames Collins        }
1170ab45ba71SJames Collins
1171ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
1172f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
11733a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
117495372bffSJames Collins            if ($conf['breadcrumbs'] !== 0) {
11759cff245bSJames Collins                if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) {
1176ab45ba71SJames Collins                    ob_start();
117775adba86SJames Collins                    tpl_breadcrumbs();
1178ab45ba71SJames Collins                    $html .= ob_get_contents();
1179ab45ba71SJames Collins                    ob_end_clean();
1180ab45ba71SJames Collins                } else {
1181ab45ba71SJames Collins                    $sep = '•';
1182ab45ba71SJames Collins                    $prefix = $lang['breadcrumb'];
1183ab45ba71SJames Collins
11849cff245bSJames Collins                    if ($this->getConf('breadcrumbSep') === true) {
1185ab45ba71SJames Collins                        $sep = $this->getConf('breadcrumbSepText');
11869cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-sep', false);
1187ab45ba71SJames Collins
11889cff245bSJames Collins                        if ($img !== false) {
1189ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1190ab45ba71SJames Collins                        }
119147161538SJames Collins                    }
119247161538SJames Collins
11939cff245bSJames Collins                    if ($this->getConf('breadcrumbPrefix') === true) {
1194ab45ba71SJames Collins                        $prefix = $this->getConf('breadcrumbPrefixText');
11959cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-prefix', false);
1196ab45ba71SJames Collins
11979cff245bSJames Collins                        if ($img !== false) {
1198ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
1199ab45ba71SJames Collins                        }
1200ab45ba71SJames Collins                    }
1201ab45ba71SJames Collins
1202ab45ba71SJames Collins                    $crumbs = breadcrumbs();
1203ab45ba71SJames Collins
1204ab45ba71SJames Collins                    $html .= '<ul>';
12053a385f2cSJames Collins                    if (empty($prefix) === false) {
12069cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12079cff245bSJames Collins                    }
1208ab45ba71SJames Collins
1209ab45ba71SJames Collins                    $last = count($crumbs);
1210ab45ba71SJames Collins                    $i    = 0;
1211ab45ba71SJames Collins                    foreach ($crumbs as $id => $name) {
1212ab45ba71SJames Collins                        $i++;
121395372bffSJames Collins                        if ($i !== 1) {
1214ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
121595372bffSJames Collins                        }
12169cff245bSJames Collins                        $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>';
12179cff245bSJames Collins                        $html .= tpl_pagelink($id, null, true);
1218ab45ba71SJames Collins                        $html .= '</li>';
1219ab45ba71SJames Collins                    }
1220ab45ba71SJames Collins
1221ab45ba71SJames Collins                    $html .= '</ul>';
12229cff245bSJames Collins                }//end if
12239cff245bSJames Collins            }//end if
12249cff245bSJames Collins        }//end if
12253d11a778SJames Collins
12263d11a778SJames Collins        $html .= '</div>';
12273d11a778SJames Collins        $html .= '</div>';
12283d11a778SJames Collins
12299cff245bSJames Collins        if ($parse === true) {
12309cff245bSJames Collins            $html = $this->includeIcons($html);
12319cff245bSJames Collins        }
12329cff245bSJames Collins        if ($print === true) {
12339cff245bSJames Collins            echo $html;
12349cff245bSJames Collins        }
12353d11a778SJames Collins        return $html;
12363d11a778SJames Collins    }
12373d11a778SJames Collins
12383d11a778SJames Collins    /**
12393d11a778SJames Collins     * Print or return you are here trail
12403d11a778SJames Collins     *
12419cff245bSJames Collins     * @param   boolean $print Print out trail.
12429cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
12439cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
12443d11a778SJames Collins     */
12459cff245bSJames Collins    public function includeYouAreHere(bool $print = true, bool $parse = true)
12463d11a778SJames Collins    {
12473d11a778SJames Collins        global $conf, $ID, $lang, $ACT;
12483d11a778SJames Collins
12493a385f2cSJames Collins        if (
12503a385f2cSJames Collins            $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 &&
125195372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0
12523a385f2cSJames Collins        ) {
12539cff245bSJames Collins            return '';
12549cff245bSJames Collins        }
12553d11a778SJames Collins
12563d11a778SJames Collins        $html = '<div class="mikio-youarehere">';
12573d11a778SJames Collins        $html .= '<div class="mikio-container">';
12583a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
125995372bffSJames Collins            if ($conf['youarehere'] !== 0) {
12609cff245bSJames Collins                if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) {
126195372bffSJames Collins                    $html .= '<div class="mikio-bcdw">';
1262ab45ba71SJames Collins                    ob_start();
126375adba86SJames Collins                    tpl_youarehere();
1264ab45ba71SJames Collins                    $html .= ob_get_contents();
1265ab45ba71SJames Collins                    ob_end_clean();
126695372bffSJames Collins                    $html .= '</div>';
1267ab45ba71SJames Collins                } else {
1268ab45ba71SJames Collins                    $sep = ' » ';
1269ab45ba71SJames Collins                    $prefix = $lang['youarehere'];
1270ab45ba71SJames Collins
12719cff245bSJames Collins                    if ($this->getConf('youarehereSep') === true) {
12723d11a778SJames Collins                        $sep = $this->getConf('youarehereSepText');
12739cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-sep', false);
1274ab45ba71SJames Collins
12759cff245bSJames Collins                        if ($img !== false) {
1276ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1277ab45ba71SJames Collins                        }
127875adba86SJames Collins                    }
127975adba86SJames Collins
12809cff245bSJames Collins                    if ($this->getConf('youareherePrefix') === true) {
12813d11a778SJames Collins                        $prefix = $this->getConf('youareherePrefixText');
12829cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-prefix', false);
1283ab45ba71SJames Collins
12849cff245bSJames Collins                        if ($img !== false) {
1285ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
128675adba86SJames Collins                        }
128747161538SJames Collins                    }
128847161538SJames Collins
1289ab45ba71SJames Collins                    $html .= '<ul>';
12903a385f2cSJames Collins                    if (empty($prefix) === false) {
12919cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
12929cff245bSJames Collins                    }
12939cff245bSJames Collins                    $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>';
1294ab45ba71SJames Collins
1295ab45ba71SJames Collins                    $parts = explode(':', $ID);
1296ab45ba71SJames Collins                    $count = count($parts);
1297ab45ba71SJames Collins
1298ab45ba71SJames Collins                    $part = '';
12999cff245bSJames Collins                    for ($i = 0; $i < ($count - 1); $i++) {
1300ab45ba71SJames Collins                        $part .= $parts[$i] . ':';
1301ab45ba71SJames Collins                        $page = $part;
13029cff245bSJames Collins                        if ($page === $conf['start']) {
13039cff245bSJames Collins                            continue;
13049cff245bSJames Collins                        }
1305ab45ba71SJames Collins
1306ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
13079cff245bSJames Collins                        $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1308ab45ba71SJames Collins                    }
1309ab45ba71SJames Collins
1310ab45ba71SJames Collins                    resolve_pageid('', $page, $exists);
13119cff245bSJames Collins                    if ((isset($page) === true && $page === $part . $parts[$i]) === false) {
1312ab45ba71SJames Collins                        $page = $part . $parts[$i];
13139cff245bSJames Collins                        if ($page !== $conf['start']) {
1314ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
13159cff245bSJames Collins                            $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1316ab45ba71SJames Collins                        }
1317ab45ba71SJames Collins                    }
1318ab45ba71SJames Collins
1319ab45ba71SJames Collins                    $html .= '</ul>';
13209cff245bSJames Collins                }//end if
13219cff245bSJames Collins            }//end if
1322ab45ba71SJames Collins
13233d11a778SJames Collins            $showLast = $this->getConf('youarehereShowLast');
13249cff245bSJames Collins            if ($showLast !== 0) {
1325a8eebd82SJames Collins                preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches);
13269cff245bSJames Collins                if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) {
1327a8eebd82SJames Collins                    $count = count($matches[0]);
1328a8eebd82SJames Collins                    $list = '';
1329a8eebd82SJames Collins
1330a8eebd82SJames Collins                    // Show Home
1331a8eebd82SJames Collins                    $list .= $matches[0][0] . $matches[0][1];
1332a8eebd82SJames Collins
1333a8eebd82SJames Collins                    $list .= '<li>...</li>';
13349cff245bSJames Collins                    for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) {
1335a8eebd82SJames Collins                        $list .= $matches[0][$i];
1336a8eebd82SJames Collins                    }
1337a8eebd82SJames Collins
1338a8eebd82SJames Collins                    $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html);
1339a8eebd82SJames Collins                }
1340a8eebd82SJames Collins            }
1341a8eebd82SJames Collins
13423d11a778SJames Collins            switch ($this->getConf('youarehereHome')) {
1343a8eebd82SJames Collins                case 'none':
1344a8eebd82SJames Collins                    $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2);
1345a8eebd82SJames Collins                    break;
1346a8eebd82SJames Collins                case 'home':
1347a8eebd82SJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1);
1348a8eebd82SJames Collins                    break;
1349a8eebd82SJames Collins                case 'icon':
13509cff245bSJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' .
13519cff245bSJames Collins                        $this->mikioInlineIcon('home') . '$3', $html, 1);
1352a8eebd82SJames Collins                    break;
1353a8eebd82SJames Collins            }
1354a8eebd82SJames Collins        } else {
1355a8eebd82SJames Collins            $html .= '&#8810; ';
13569cff245bSJames Collins            if (isset($_GET['page']) === true) {
13579cff245bSJames Collins                $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
1358a8eebd82SJames Collins            }
13594057121fSJames Collins            $html .= '<a href="' . wl($ID) . '">View Page</a>';
13609cff245bSJames Collins        }//end if
13619cff245bSJames Collins
13629cff245bSJames Collins        $html .= '</div>';
13639cff245bSJames Collins        $html .= '</div>';
13649cff245bSJames Collins
13659cff245bSJames Collins        if ($parse === true) {
13669cff245bSJames Collins            $html = $this->includeIcons($html);
1367a8eebd82SJames Collins        }
13689cff245bSJames Collins        if ($print === true) {
13699cff245bSJames Collins            echo $html;
13709cff245bSJames Collins        }
1371ab45ba71SJames Collins        return $html;
1372ab45ba71SJames Collins    }
1373ab45ba71SJames Collins
13741785fc73SJames Collins    /**
13751785fc73SJames Collins     * Get Page Title
13769cff245bSJames Collins     *
13779cff245bSJames Collins     * @return string page title
13781785fc73SJames Collins     */
137910b40067Snomadjimbob    public function parsePageTitle()
138010b40067Snomadjimbob    {
13812060e56cSJames Collins        global $ID;
13822060e56cSJames Collins
13832060e56cSJames Collins        $title = p_get_first_heading($ID);
13849cff245bSJames Collins        if (strlen($title) <= 0) {
13859cff245bSJames Collins            $title = tpl_pagetitle(null, true);
13869cff245bSJames Collins        }
13871785fc73SJames Collins        $title = $this->includeIcons($title);
13881785fc73SJames Collins
13891785fc73SJames Collins        return $title;
13901785fc73SJames Collins    }
13911785fc73SJames Collins
1392ab45ba71SJames Collins
139375adba86SJames Collins    /**
1394a8eebd82SJames Collins     * Print or return hero block
139575adba86SJames Collins     *
13969cff245bSJames Collins     * @param   boolean $print Print content.
1397a8eebd82SJames Collins     * @return  string         contents of hero
139875adba86SJames Collins     */
13999cff245bSJames Collins    public function includeHero(bool $print = true)
140010b40067Snomadjimbob    {
1401a8eebd82SJames Collins        $html = '';
140247161538SJames Collins
14039cff245bSJames Collins        if ($this->getConf('heroTitle') === true) {
1404a8eebd82SJames Collins            $html .= '<div class="mikio-hero">';
1405f8039bf2SJames Collins            $html .= '<div class="mikio-container">';
1406a8eebd82SJames Collins            $html .= '<div class="mikio-hero-text">';
14073a385f2cSJames Collins            if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) {
14089cff245bSJames Collins                $html .= $this->includeYouAreHere(false);
14099cff245bSJames Collins            }
14103a385f2cSJames Collins            if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) {
14119cff245bSJames Collins                $html .= $this->includeBreadcrumbs(false);
14129cff245bSJames Collins            }
1413ab45ba71SJames Collins
1414a8eebd82SJames Collins            $html .= '<h1 class="mikio-hero-title">';
14151785fc73SJames Collins            $html .= $this->parsePageTitle();    // No idea why this requires a blank space afterwards to work?
1416a8eebd82SJames Collins            $html .= '</h1>';
1417a8eebd82SJames Collins            $html .= '<h2 class="mikio-hero-subtitle"></h2>';
1418a8eebd82SJames Collins            $html .= '</div>';
141947161538SJames Collins
14209cff245bSJames Collins            $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true));
1421a8eebd82SJames Collins            $hero_image_resize_class = '';
14223a385f2cSJames Collins            if (empty($hero_image) === false) {
1423a8eebd82SJames Collins                $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"';
1424a8eebd82SJames Collins                $hero_image_resize_class = ' mikio-hero-image-resize';
142547161538SJames Collins            }
1426a8eebd82SJames Collins
14279cff245bSJames Collins            $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image .
14289cff245bSJames Collins                '><div class="mikio-tags"></div></div>';
1429a8eebd82SJames Collins
1430a8eebd82SJames Collins            $html .= '</div>';
1431f8039bf2SJames Collins            $html .= '</div>';
14329cff245bSJames Collins        }//end if
14339cff245bSJames Collins
14349cff245bSJames Collins        if ($print === true) {
14359cff245bSJames Collins            echo $html;
143675adba86SJames Collins        }
1437a8eebd82SJames Collins
1438a8eebd82SJames Collins        return $html;
143975adba86SJames Collins    }
144075adba86SJames Collins
144175adba86SJames Collins
144275adba86SJames Collins    /**
1443a8eebd82SJames Collins     * Print or return out TOC
144475adba86SJames Collins     *
14459cff245bSJames Collins     * @param   boolean $print Print TOC.
14469cff245bSJames Collins     * @param   boolean $parse Parse icons.
1447a8eebd82SJames Collins     * @return  string         contents of TOC
144875adba86SJames Collins     */
14499cff245bSJames Collins    public function includeTOC(bool $print = true, bool $parse = true)
145010b40067Snomadjimbob    {
1451ab45ba71SJames Collins        $html = '';
14522b4583abSJames Collins
1453ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
1454ab45ba71SJames Collins
14553a385f2cSJames Collins        if (empty($tocHtml) === false) {
1456ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
1457a8eebd82SJames Collins            $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml);
1458ab45ba71SJames Collins
1459ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
1460ab45ba71SJames Collins            $html .= $tocHtml;
1461ab45ba71SJames Collins            $html .= '</div>';
14622b4583abSJames Collins        }
14632b4583abSJames Collins
14649cff245bSJames Collins        if ($parse === true) {
14659cff245bSJames Collins            $html = $this->includeIcons($html);
14669cff245bSJames Collins        }
14679cff245bSJames Collins
14689cff245bSJames Collins        if ($print === true) {
1469ab45ba71SJames Collins            echo $html;
1470ab45ba71SJames Collins        }
1471ab45ba71SJames Collins
14729cff245bSJames Collins        return $html;
14739cff245bSJames Collins    }
14749cff245bSJames Collins
1475ab45ba71SJames Collins
1476a8eebd82SJames Collins    /**
1477ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
1478ab45ba71SJames Collins     *
14799cff245bSJames Collins     * @param   string $str Content to parse.
1480ab45ba71SJames Collins     * @return  string      parsed string
1481ab45ba71SJames Collins     */
14829cff245bSJames Collins    public function includeIcons(string $str)
148310b40067Snomadjimbob    {
1484ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
1485ab45ba71SJames Collins
1486ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
14873a385f2cSJames Collins        if (empty($iconTag) === true) {
14889cff245bSJames Collins            return $str;
14899cff245bSJames Collins        }
1490ab45ba71SJames Collins
14919cff245bSJames Collins        if (
14929cff245bSJames Collins            in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true ||
14933a385f2cSJames Collins            strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0
14949cff245bSJames Collins        ) {
1495a2005a27SJames Collins            $content = $str;
1496a2005a27SJames Collins            $preview = null;
1497a2005a27SJames Collins
14983a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
14999cff245bSJames Collins                $html = new \simple_html_dom();
1500a2005a27SJames Collins                $html->stripRNAttrValues = false;
1501a2005a27SJames Collins                $html->load($str, true, false);
1502a2005a27SJames Collins
1503a2005a27SJames Collins                $preview = $html->find('div.preview');
15049cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1505a2005a27SJames Collins                    $content = $preview[0]->innertext;
1506a2005a27SJames Collins                }
1507a2005a27SJames Collins            }
1508a2005a27SJames Collins
15091785fc73SJames Collins            $page_regex = '/(.*)/';
15109cff245bSJames Collins            if (stripos($str, '<pre') !== false) {
15111785fc73SJames Collins                $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/';
15121785fc73SJames Collins            }
15131785fc73SJames Collins
15141785fc73SJames Collins            $content = preg_replace_callback($page_regex, function ($icons) {
1515a2005a27SJames Collins                $iconTag = $this->getConf('iconTag', 'icon');
1516a2005a27SJames Collins
151710b40067Snomadjimbob                return preg_replace_callback(
151810b40067Snomadjimbob                    '/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
1519ab45ba71SJames Collins                    function ($matches) {
1520ab45ba71SJames Collins                        global $MIKIO_ICONS;
1521ab45ba71SJames Collins
1522ab45ba71SJames Collins                        $s = $matches[0];
1523ab45ba71SJames Collins
1524ab45ba71SJames Collins                        if (count($MIKIO_ICONS) > 0) {
1525ab45ba71SJames Collins                            $icon = $MIKIO_ICONS[0];
1526ab45ba71SJames Collins
1527ab45ba71SJames Collins                            if (count($matches) > 1) {
1528ab45ba71SJames Collins                                $e = explode(' ', $matches[1]);
1529ab45ba71SJames Collins
1530ab45ba71SJames Collins                                if (count($e) > 1) {
1531ab45ba71SJames Collins                                    foreach ($MIKIO_ICONS as $iconItem) {
15329cff245bSJames Collins                                        if (strcasecmp($iconItem['name'], $e[0]) === 0) {
1533ab45ba71SJames Collins                                            $icon = $iconItem;
1534ab45ba71SJames Collins
1535ab45ba71SJames Collins                                            $s = $icon['insert'];
1536ab45ba71SJames Collins                                            for ($i = 1; $i < 9; $i++) {
15373a385f2cSJames Collins                                                if (count(empty($e) < $i || $e[$i]) === true) {
15389cff245bSJames Collins                                                    if (isset($icon['$' . $i]) === true) {
1539ab45ba71SJames Collins                                                        $s = str_replace('$' . $i, $icon['$' . $i], $s);
1540ab45ba71SJames Collins                                                    }
1541ab45ba71SJames Collins                                                } else {
1542ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $e[$i], $s);
1543ab45ba71SJames Collins                                                }
1544ab45ba71SJames Collins                                            }
1545ab45ba71SJames Collins
1546ab45ba71SJames Collins                                            $dir = '';
15479cff245bSJames Collins                                            if (isset($icon['dir']) === true) {
15489cff245bSJames Collins                                                $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
15499cff245bSJames Collins                                            }
1550ab45ba71SJames Collins
1551ab45ba71SJames Collins                                            $s = str_replace('$0', $dir, $s);
1552ab45ba71SJames Collins
1553ab45ba71SJames Collins                                            break;
15549cff245bSJames Collins                                        }//end if
15559cff245bSJames Collins                                    }//end foreach
1556ab45ba71SJames Collins                                } else {
1557ab45ba71SJames Collins                                    $s = str_replace('$1', $matches[1], $icon['insert']);
15589cff245bSJames Collins                                }//end if
15599cff245bSJames Collins                            }//end if
15609cff245bSJames Collins                        }//end if
156175adba86SJames Collins
1562ab45ba71SJames Collins                        $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
15639cff245bSJames Collins                        if ($count === 0) {
1564ab45ba71SJames Collins                            $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
1565ab45ba71SJames Collins                        }
1566ab45ba71SJames Collins
1567ab45ba71SJames Collins                        return $s;
1568ab45ba71SJames Collins                    },
156910b40067Snomadjimbob                    $icons[0]
157010b40067Snomadjimbob                );
1571a2005a27SJames Collins            }, $content);
1572a2005a27SJames Collins
15733a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
15749cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1575a2005a27SJames Collins                    $preview[0]->innertext = $content;
1576a2005a27SJames Collins                }
1577a2005a27SJames Collins
1578a2005a27SJames Collins                $str = $html->save();
1579a2005a27SJames Collins                $html->clear();
1580a2005a27SJames Collins                unset($html);
1581a2005a27SJames Collins            } else {
1582a2005a27SJames Collins                $str = $content;
1583a2005a27SJames Collins            }
15849cff245bSJames Collins        }//end if
1585ab45ba71SJames Collins
1586ab45ba71SJames Collins        return $str;
1587ab45ba71SJames Collins    }
158847161538SJames Collins
1589c165b184SJames Collins    /**
1590a8eebd82SJames Collins     * Parse HTML for theme
1591c165b184SJames Collins     *
15929cff245bSJames Collins     * @param   string $content HTML content to parse.
1593a8eebd82SJames Collins     * @return  string          Parsed content
1594c165b184SJames Collins     */
15959cff245bSJames Collins    public function parseContent(string $content)
159610b40067Snomadjimbob    {
1597ab45ba71SJames Collins        global $INPUT, $ACT;
1598ab45ba71SJames Collins
1599a8eebd82SJames Collins        // Add Mikio Section titles
16003a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
16019cff245bSJames Collins            $admin_sections = [
1602ab45ba71SJames Collins                // Section      Insert Before                 Icon
16039cff245bSJames Collins                'navbar'        => ['navbarUseTitleIcon',      ''],
16049cff245bSJames Collins                'search'        => ['searchButton',            ''],
16059cff245bSJames Collins                'hero'          => ['heroTitle',               ''],
16069cff245bSJames Collins                'tags'          => ['tagsConsolidate',         ''],
16079cff245bSJames Collins                'breadcrumb'    => ['breadcrumbHideHome',      ''],
16089cff245bSJames Collins                'youarehere'    => ['youarehereHideHome',      ''],
16099cff245bSJames Collins                'sidebar'       => ['sidebarShowLeft',         ''],
16109cff245bSJames Collins                'toc'           => ['tocFull',                 ''],
16119cff245bSJames Collins                'pagetools'     => ['pageToolsFloating',       ''],
16129cff245bSJames Collins                'footer'        => ['footerCustomMenuText',    ''],
16139cff245bSJames Collins                'license'       => ['licenseType',             ''],
16149cff245bSJames Collins                'acl'           => ['includePageUseACL',       ''],
16159cff245bSJames Collins                'sticky'        => ['stickyTopHeader',         ''],
16169cff245bSJames Collins            ];
1617ab45ba71SJames Collins
1618ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
1619ab45ba71SJames Collins                $search = $items[0];
1620ab45ba71SJames Collins                $icon   = $items[1];
1621ab45ba71SJames Collins
162210b40067Snomadjimbob                $content = preg_replace(
1623adf52ebbSJames Collins                    '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/',
16249cff245bSJames Collins                    '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) .
16259cff245bSJames Collins                        tpl_getLang('config_' . $section) .
16269cff245bSJames Collins                        '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' .
16279cff245bSJames Collins                        $search . '</span>',
162810b40067Snomadjimbob                    $content
162910b40067Snomadjimbob                );
1630ab45ba71SJames Collins            }
16319cff245bSJames Collins        }//end if
1632ab45ba71SJames Collins
16333a385f2cSJames Collins        if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
1634a8eebd82SJames Collins            $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content);
1635a8eebd82SJames Collins        }
1636ab45ba71SJames Collins
1637a8eebd82SJames Collins        // Page Revisions - Table Fix
16389cff245bSJames Collins        if (strpos($content, 'id="page__revisions"') !== false) {
16399cff245bSJames Collins            $content = preg_replace(
16409cff245bSJames Collins                '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/',
16419cff245bSJames Collins                '<span>$1</span>',
16429cff245bSJames Collins                $content
16439cff245bSJames Collins            );
1644a8eebd82SJames Collins        }
1645ab45ba71SJames Collins
16469cff245bSJames Collins        $html = new \simple_html_dom();
1647bc1032d9SJames Collins        $html->stripRNAttrValues = false;
1648c165b184SJames Collins        $html->load($content, true, false);
1649c165b184SJames Collins
16509cff245bSJames Collins        if ($html === false) {
16519cff245bSJames Collins            return $content;
16529cff245bSJames Collins        }
1653ab45ba71SJames Collins
1654ab45ba71SJames Collins        /* Buttons */
1655ab45ba71SJames Collins        foreach ($html->find('#config__manager button') as $node) {
1656ab45ba71SJames Collins            $c = explode(' ', $node->class);
16579cff245bSJames Collins            if (in_array('mikio-button', $c) === false) {
16589cff245bSJames Collins                $c[] = 'mikio-button';
16599cff245bSJames Collins            }
1660ab45ba71SJames Collins            $node->class = implode(' ', $c);
1661c165b184SJames Collins        }
1662c165b184SJames Collins
1663ab45ba71SJames Collins
1664ab45ba71SJames Collins        /* Buttons - Primary */
1665ab45ba71SJames Collins        foreach ($html->find('#config__manager [type=submit]') as $node) {
1666ab45ba71SJames Collins            $c = explode(' ', $node->class);
16679cff245bSJames Collins            if (in_array('mikio-primary', $c) === false) {
16689cff245bSJames Collins                $c[] = 'mikio-primary';
16699cff245bSJames Collins            }
1670ab45ba71SJames Collins            $node->class = implode(' ', $c);
1671ab45ba71SJames Collins        }
1672ab45ba71SJames Collins
1673a8eebd82SJames Collins        /* Hide page title if hero is enabled */
16749cff245bSJames Collins        if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
16751785fc73SJames Collins            $pageTitle = $this->parsePageTitle();
167647161538SJames Collins
167747161538SJames Collins            foreach ($html->find('h1,h2,h3,h4') as $elm) {
16789cff245bSJames Collins                if ($elm->innertext === $pageTitle) {
1679a8eebd82SJames Collins                    // $elm->innertext = '';
1680a8eebd82SJames Collins                    $elm->setAttribute('style', 'display:none');
1681a8eebd82SJames Collins
168247161538SJames Collins                    break;
168347161538SJames Collins                }
168447161538SJames Collins            }
168547161538SJames Collins        }
1686c165b184SJames Collins
1687a8eebd82SJames Collins        /* Hero subtitle */
16882b4583abSJames Collins        foreach ($html->find('p') as $elm) {
16892b4583abSJames Collins            $i = stripos($elm->innertext, '~~hero-subtitle');
16902b4583abSJames Collins            if ($i !== false) {
16919cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
16922b4583abSJames Collins                if ($j !== false) {
16939cff245bSJames Collins                    if ($j > ($i + 16)) {
16949cff245bSJames Collins                        $subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16));
1695a8eebd82SJames Collins                        $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
1696a8eebd82SJames Collins
1697a8eebd82SJames Collins                        // $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2);
1698a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext);
16992b4583abSJames Collins                    }
17002b4583abSJames Collins
17012b4583abSJames Collins                    break;
17022b4583abSJames Collins                }
17032b4583abSJames Collins            }
17042b4583abSJames Collins        }
17052b4583abSJames Collins
1706a8eebd82SJames Collins        /* Hero image */
1707a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1708a8eebd82SJames Collins            $image = '';
1709a8eebd82SJames Collins            preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches);
1710a8eebd82SJames Collins            if (count($matches) > 0) {
1711a8eebd82SJames Collins                preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches);
1712a8eebd82SJames Collins                if (count($imageTagMatches) > 0) {
1713a8eebd82SJames Collins                    $image = $imageTagMatches[1];
1714a8eebd82SJames Collins                } else {
1715a8eebd82SJames Collins                    preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches);
1716a8eebd82SJames Collins                    if (count($imageTagMatches) > 0) {
1717a8eebd82SJames Collins                        $image = $imageTagMatches[1];
1718a8eebd82SJames Collins                    } else {
1719a8eebd82SJames Collins                        $image = strip_tags($matches[1]);
17209cff245bSJames Collins                        if (stripos($image, ':') === false) {
17219cff245bSJames Collins                            $image = str_replace(['{', '}'], '', $image);
1722a8eebd82SJames Collins                            $i = stripos($image, '?');
17239cff245bSJames Collins                            if ($i !== false) {
1724a8eebd82SJames Collins                                $image = substr($image, 0, $i);
1725c165b184SJames Collins                            }
1726c165b184SJames Collins
1727a8eebd82SJames Collins                            $image = ml($image, '', true, '', false);
1728ab45ba71SJames Collins                        }
1729ab45ba71SJames Collins                    }
1730ab45ba71SJames Collins                }
1731ab45ba71SJames Collins
1732a8eebd82SJames Collins                $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
1733a8eebd82SJames Collins
1734a8eebd82SJames Collins                $elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext);
17359cff245bSJames Collins            }//end if
17369cff245bSJames Collins        }//end foreach
1737ab45ba71SJames Collins
17389cff245bSJames Collins        /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
17399cff245bSJames Collins        [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
1740a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1741a8eebd82SJames Collins            $i = stripos($elm->innertext, '~~hero-colors');
1742a8eebd82SJames Collins            if ($i !== false) {
17439cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
1744a8eebd82SJames Collins                if ($j !== false) {
17459cff245bSJames Collins                    if ($j > ($i + 14)) {
17469cff245bSJames Collins                        $color = substr($elm->innertext, ($i + 14), ($j - $i - 14));
1747a8eebd82SJames Collins                        $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')';
1748ab45ba71SJames Collins
1749a8eebd82SJames Collins                        $elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext);
1750ab45ba71SJames Collins                    }
1751ab45ba71SJames Collins
1752a8eebd82SJames Collins                    break;
1753ab45ba71SJames Collins                }
1754ab45ba71SJames Collins            }
1755ab45ba71SJames Collins        }
1756ab45ba71SJames Collins
175796ec8e1eSJames Collins        /* Hide parts - ~~hide-parts [parts]~~  */
175896ec8e1eSJames Collins        foreach ($html->find('p') as $elm) {
175996ec8e1eSJames Collins            $i = stripos($elm->innertext, '~~hide-parts');
176096ec8e1eSJames Collins            if ($i !== false) {
17619cff245bSJames Collins                $j = strpos($elm->innertext, '~~', ($i + 2));
176296ec8e1eSJames Collins                if ($j !== false) {
17639cff245bSJames Collins                    if ($j > ($i + 13)) {
17649cff245bSJames Collins                        $parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13)));
176596ec8e1eSJames Collins                        $script = '';
176696ec8e1eSJames Collins
176796ec8e1eSJames Collins                        foreach ($parts as $part) {
176896ec8e1eSJames Collins                            // $part = trim($part);
176996ec8e1eSJames Collins                            if (strlen($part) > 0) {
177096ec8e1eSJames Collins                                $script .= 'mikio.hidePart(\'' . $part . '\');';
177196ec8e1eSJames Collins                            }
177296ec8e1eSJames Collins                        }
177396ec8e1eSJames Collins
177496ec8e1eSJames Collins                        if (strlen($script) > 0) {
177596ec8e1eSJames Collins                            $this->footerScript['hide-parts'] = $script;
177696ec8e1eSJames Collins                        }
177796ec8e1eSJames Collins
177896ec8e1eSJames Collins                        $elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext);
177996ec8e1eSJames Collins                    }
178096ec8e1eSJames Collins
178196ec8e1eSJames Collins                    break;
17829cff245bSJames Collins                }//end if
17839cff245bSJames Collins            }//end if
17849cff245bSJames Collins        }//end foreach
178596ec8e1eSJames Collins
178696ec8e1eSJames Collins
1787a8eebd82SJames Collins        /* Page Tags (tag plugin) */
17889cff245bSJames Collins        if ($this->getConf('tagsConsolidate') === true) {
1789a8eebd82SJames Collins            $tags = '';
1790a8eebd82SJames Collins            foreach ($html->find('div.tags a') as $elm) {
1791a8eebd82SJames Collins                $tags .= $elm->outertext;
1792a8eebd82SJames Collins            }
1793a8eebd82SJames Collins
1794a8eebd82SJames Collins            foreach ($html->find('div.tags') as $elm) {
1795a8eebd82SJames Collins                $elm->innertext = '';
1796a8eebd82SJames Collins                $elm->setAttribute('style', 'display:none');
1797a8eebd82SJames Collins            }
1798a8eebd82SJames Collins
17993a385f2cSJames Collins            if (empty($tags) === false) {
1800a8eebd82SJames Collins                $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
1801a8eebd82SJames Collins            }
1802ab45ba71SJames Collins        }
1803ab45ba71SJames Collins
1804ab45ba71SJames Collins        // Configuration Manager
18053a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
1806ab45ba71SJames Collins            // Additional save buttons
1807ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
1808ab45ba71SJames Collins                $saveButtons = '';
1809ab45ba71SJames Collins
1810ab45ba71SJames Collins                foreach ($cm->find('p') as $elm) {
1811ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
1812a8eebd82SJames Collins                    $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons);
1813ab45ba71SJames Collins                    $elm->outertext = '';
1814ab45ba71SJames Collins                }
1815ab45ba71SJames Collins
1816ab45ba71SJames Collins                foreach ($cm->find('fieldset') as $elm) {
1817ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
1818ab45ba71SJames Collins                }
1819ab45ba71SJames Collins            }
1820ab45ba71SJames Collins        }
1821ab45ba71SJames Collins
1822ab45ba71SJames Collins        $content = $html->save();
1823c165b184SJames Collins        $html->clear();
1824c165b184SJames Collins        unset($html);
1825c165b184SJames Collins
1826c165b184SJames Collins        return $content;
1827c165b184SJames Collins    }
18282b4583abSJames Collins
18292b4583abSJames Collins
1830a8eebd82SJames Collins    /**
1831a8eebd82SJames Collins     * Get DokuWiki namespace/page/URI as link
1832a8eebd82SJames Collins     *
18339cff245bSJames Collins     * @param   string $str String to parse.
18349cff245bSJames Collins     * @return  string      parsed URI
1835a8eebd82SJames Collins     */
18369cff245bSJames Collins    public function getLink(string $str)
183710b40067Snomadjimbob    {
18382b4583abSJames Collins        $i = strpos($str, '://');
18399cff245bSJames Collins        if ($i !== false) {
18409cff245bSJames Collins            return $str;
18419cff245bSJames Collins        }
18422b4583abSJames Collins
18432b4583abSJames Collins        return wl($str);
18442b4583abSJames Collins    }
1845ab45ba71SJames Collins
1846ab45ba71SJames Collins
1847a8eebd82SJames Collins    /**
1848a8eebd82SJames Collins     * Check if the user can edit current namespace/page
1849a8eebd82SJames Collins     *
1850a8eebd82SJames Collins     * @return  boolean  user can edit
1851a8eebd82SJames Collins     */
185210b40067Snomadjimbob    public function userCanEdit()
185310b40067Snomadjimbob    {
1854ab45ba71SJames Collins        global $INFO;
1855ab45ba71SJames Collins        global $ID;
1856ab45ba71SJames Collins
1857ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
18589cff245bSJames Collins        if (@file_exists($wiki_file) === false) {
18599cff245bSJames Collins            return true;
18609cff245bSJames Collins        }
18619cff245bSJames Collins        if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
18629cff245bSJames Collins            return true;
18639cff245bSJames Collins        }
1864a8eebd82SJames Collins        // $meta_file = metaFN($ID, '.meta');
18659cff245bSJames Collins        if ($INFO['meta']['user'] === false) {
18669cff245bSJames Collins            return true;
18679cff245bSJames Collins        }
18689cff245bSJames Collins        if ($INFO['client'] === $INFO['meta']['user']) {
18699cff245bSJames Collins            return true;
18709cff245bSJames Collins        }
1871ab45ba71SJames Collins
1872ab45ba71SJames Collins        return false;
1873c165b184SJames Collins    }
187447161538SJames Collins
187547161538SJames Collins
1876a8eebd82SJames Collins    /**
1877a8eebd82SJames Collins     * Search for and return the uri of a media file
1878a8eebd82SJames Collins     *
18799cff245bSJames Collins     * @param string  $image           Image name to search for (without extension).
18809cff245bSJames Collins     * @param boolean $searchCurrentNS Search the current namespace.
18819cff245bSJames Collins     * @param boolean $propagate       Propagate search through the namespace.
18829cff245bSJames Collins     * @return string                  URI of the found media file
1883a8eebd82SJames Collins     */
18849cff245bSJames Collins    public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
188510b40067Snomadjimbob    {
1886ab45ba71SJames Collins        global $INFO;
1887a8eebd82SJames Collins
18889cff245bSJames Collins        $ext = ['png', 'jpg', 'gif', 'svg'];
1889ab45ba71SJames Collins
18909cff245bSJames Collins        if ($searchCurrentNS === true) {
18919cff245bSJames Collins            $prefix[] = ':' . $INFO['namespace'] . ':';
18929cff245bSJames Collins        }
18939cff245bSJames Collins        if ($propagate === true) {
1894ab45ba71SJames Collins            $prefix[] = ':';
1895ab45ba71SJames Collins            $prefix[] = ':wiki:';
1896a8eebd82SJames Collins        }
1897ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
18983a385f2cSJames Collins        if (empty($theme) === false) {
18999cff245bSJames Collins            $prefix[] = 'themes/' . $theme . '/images/';
19009cff245bSJames Collins        }
1901ab45ba71SJames Collins        $prefix[] = 'images/';
1902ab45ba71SJames Collins
19039cff245bSJames Collins        $search = [];
1904ab45ba71SJames Collins        foreach ($prefix as $pitem) {
1905ab45ba71SJames Collins            foreach ($ext as $eitem) {
1906ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
1907ab45ba71SJames Collins            }
1908ab45ba71SJames Collins        }
1909ab45ba71SJames Collins
1910ab45ba71SJames Collins        $img = '';
1911ab45ba71SJames Collins        $file = '';
1912ab45ba71SJames Collins        $url = '';
1913ab45ba71SJames Collins        $ismedia = false;
1914ab45ba71SJames Collins        $found = false;
1915ab45ba71SJames Collins
1916ab45ba71SJames Collins        foreach ($search as $img) {
19173a385f2cSJames Collins            if (strcasecmp(substr($img, 0, 1), ':') === 0) {
1918ab45ba71SJames Collins                $file    = mediaFN($img);
1919ab45ba71SJames Collins                $ismedia = true;
1920ab45ba71SJames Collins            } else {
1921ab45ba71SJames Collins                $file    = tpl_incdir() . $img;
1922ab45ba71SJames Collins                $ismedia = false;
1923ab45ba71SJames Collins            }
1924ab45ba71SJames Collins
19259cff245bSJames Collins            if (file_exists($file) === true) {
1926ab45ba71SJames Collins                $found = true;
1927ab45ba71SJames Collins                break;
1928ab45ba71SJames Collins            }
1929ab45ba71SJames Collins        }
1930ab45ba71SJames Collins
19319cff245bSJames Collins        if ($found === false) {
19329cff245bSJames Collins            return false;
19339cff245bSJames Collins        }
1934ab45ba71SJames Collins
19359cff245bSJames Collins        if ($ismedia === true) {
1936ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
1937ab45ba71SJames Collins        } else {
1938ab45ba71SJames Collins            $url = tpl_basedir() . $img;
1939ab45ba71SJames Collins        }
1940ab45ba71SJames Collins
1941ab45ba71SJames Collins        return $url;
1942ab45ba71SJames Collins    }
1943ab45ba71SJames Collins
1944a8eebd82SJames Collins
1945a8eebd82SJames Collins    /**
1946ab45ba71SJames Collins     * Print or return the page title
1947ab45ba71SJames Collins     *
19489cff245bSJames Collins     * @param string $page Page id or empty string for current page.
1949ab45ba71SJames Collins     * @return string      generated content
1950ab45ba71SJames Collins     */
19519cff245bSJames Collins    public function getPageTitle(string $page = '')
195210b40067Snomadjimbob    {
1953ab45ba71SJames Collins        global $ID, $conf;
1954ab45ba71SJames Collins
1955ab45ba71SJames Collins        $html = '';
1956ab45ba71SJames Collins
19573a385f2cSJames Collins        if (empty($page) === true) {
19589cff245bSJames Collins            $page = $ID;
19599cff245bSJames Collins        }
1960ab45ba71SJames Collins
1961ab45ba71SJames Collins        $html = p_get_first_heading($page);
1962ab45ba71SJames Collins        $html = strip_tags($html);
1963ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
1964ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
1965ab45ba71SJames Collins        $html = trim($html);
1966ab45ba71SJames Collins
1967ab45ba71SJames Collins        return $html;
1968ab45ba71SJames Collins    }
1969a8eebd82SJames Collins
1970a8eebd82SJames Collins
1971a8eebd82SJames Collins    /**
1972a8eebd82SJames Collins     * Return inline theme icon
1973a8eebd82SJames Collins     *
19749cff245bSJames Collins     * @param   string $type Icon to retreive.
19759cff245bSJames Collins     * @return  string       HTML icon content
1976a8eebd82SJames Collins     */
19779cff245bSJames Collins    public function mikioInlineIcon(string $type)
197810b40067Snomadjimbob    {
1979a8eebd82SJames Collins        switch ($type) {
1980a8eebd82SJames Collins            case 'wrench':
19819cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
19829cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,53.152542,1217.0847)"><path d="m 384,64 q 0,26 -19,45 -19,19
19839cff245bSJames Collins-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,-37
19849cff245bSJames Collins-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,435 q
19859cff245bSJames Collins0,-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 131.5,
19869cff245bSJames Collins131.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,-107 q 5,
19879cff245bSJames Collins3 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>';
1988a8eebd82SJames Collins            case 'file':
19899cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
19909cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991"><path d="M 128,0 H 1152 V 768
19919cff245bSJames CollinsH 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 1280,768 V -32 q 0,-40 -28,
19929cff245bSJames Collins-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 q 40,0 88,-20 48,-20 76,-48
19939cff245bSJames Collinsl 408,-408 q 28,-28 48,-76 20,-48 20,-88 z" id="path2993" inkscape:connector-curvature="0"
19949cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
1995a8eebd82SJames Collins            case 'gear':
19969cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
19979cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027"><path d="m 1024,640 q 0,106
19989cff245bSJames Collins-75,181 -75,75 -181,75 -106,0 -181,-75 -75,-75 -75,-181 0,-106 75,-181 75,-75 181,-75 106,0 181,75 75,75 75,181 z m
19999cff245bSJames Collins512,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 10,-25 0,-13 -9,-23 -27,
20009cff245bSJames Collins-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 -36,-28 H 657 q -14,0
20019cff245bSJames Collins-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 147,186 q -7,10 -7,23
20029cff245bSJames Collins0,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 q 0,12 8,23 8,11 19,
20039cff245bSJames Collins13 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,71.5 13,0 26,-10 l
20049cff245bSJames Collins138,-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 q 49,-16 90,-37 l
20059cff245bSJames Collins142,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 -54,-70.5 26,-50
20069cff245bSJames Collins41,-98 l 183,-28 q 13,-2 21,-12.5 8,-10.5 8,-23.5 z" id="path3029" inkscape:connector-curvature="0" /></g></svg>';
2007a8eebd82SJames Collins            case 'user':
20089cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
20099cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M 1408,131 Q 1408,11 1335,-58.5
20109cff245bSJames Collins1262,-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 28,402 44,452 q 16,50 43,97.5
20119cff245bSJames Collins27,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,-26.5 108,-48 Q 637,565 704,565 q
20129cff245bSJames Collins67,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 50.5,-20 85.5,-53.5 35,-33.5 62,-81
20139cff245bSJames Collins27,-47.5 43,-97.5 16,-50 26.5,-108.5 10.5,-58.5 14,-109 Q 1408,184 1408,131 z m -320,893 Q 1088,865 975.5,752.5 863,640
20149cff245bSJames Collins704,640 545,640 432.5,752.5 320,865 320,1024 320,1183 432.5,1295.5 545,1408 704,1408 863,1408 975.5,1295.5 1088,1183
20159cff245bSJames Collins1088,1024 z"/></g></svg>';
2016a8eebd82SJames Collins            case 'search':
20179cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
20189cff245bSJames 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
20199cff245bSJames 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
20209cff245bSJames 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
20219cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>';
2022a8eebd82SJames Collins            case 'home':
20239cff245bSJames Collins                return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792"
20249cff245bSJames Collinsaria-hidden="true" style="fill:currentColor"><g transform="matrix(1,0,0,-1,68.338983,1285.4237)" id="g3015">
20259cff245bSJames Collins<path d="M 1408,544 V 64 Q 1408,38 1389,19 1370,0 1344,0 H 960 V 384 H 704 V 0 H 320 q -26,0 -45,19 -19,19 -19,
20269cff245bSJames Collins45 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 m 223,69 -62,-74 q -8,-9 -21,-11 h -3 q -13,
20279cff245bSJames Collins0 -21,7 L 832,1112 140,535 q -12,-8 -24,-7 -13,2 -21,11 l -62,74 q -8,10 -7,23.5 1,13.5 11,21.5 l 719,
20289cff245bSJames Collins599 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,-9 9,-23 V 840 l 219,
20299cff245bSJames Collins-182 q 10,-8 11,-21.5 1,-13.5 -7,-23.5 z" id="path3017" inkscape:connector-curvature="0"
20309cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
20319cff245bSJames Collins        }//end switch
2032ab45ba71SJames Collins
2033a8eebd82SJames Collins        return '';
2034a8eebd82SJames Collins    }
2035ab45ba71SJames Collins
2036a8eebd82SJames Collins    /**
2037a8eebd82SJames Collins     * Finalize theme
20389cff245bSJames Collins     *
20399cff245bSJames Collins     * @return void
2040a8eebd82SJames Collins     */
204110b40067Snomadjimbob    public function finalize()
204210b40067Snomadjimbob    {
2043a8eebd82SJames Collins    }
20441785fc73SJames Collins
20451785fc73SJames Collins    /**
20461785fc73SJames Collins     * Show Messages
20479cff245bSJames Collins     *
20489cff245bSJames Collins     * @return void
20491785fc73SJames Collins     */
205010b40067Snomadjimbob    public function showMessages()
205110b40067Snomadjimbob    {
20521785fc73SJames Collins        global $ACT;
20531785fc73SJames Collins
20549cff245bSJames Collins        if ($this->lessIgnored === true) {
20559cff245bSJames Collins            msg(
20569cff245bSJames Collins                'useLESS is enabled on the Mikio template, however is not supported on this server',
20579cff245bSJames Collins                2,
20589cff245bSJames Collins                '',
20599cff245bSJames Collins                '',
20609cff245bSJames Collins                MSG_ADMINS_ONLY
20619cff245bSJames Collins            );
2062a8df40efSJames Collins        }
2063a8df40efSJames Collins
20641785fc73SJames Collins        $show = $this->getConf('showNotifications');
20653a385f2cSJames Collins        if (
20663a385f2cSJames Collins            strcasecmp($show, 'always') === 0 ||
20673a385f2cSJames Collins            (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
20683a385f2cSJames Collins        ) {
20691785fc73SJames Collins            global $MSG, $MSG_shown;
20701785fc73SJames Collins
20719cff245bSJames Collins            if (isset($MSG) === false) {
20721785fc73SJames Collins                return;
20731785fc73SJames Collins            }
20741785fc73SJames Collins
20759cff245bSJames Collins            if (isset($MSG_shown) === false) {
20769cff245bSJames Collins                $MSG_shown = [];
2077a8df40efSJames Collins            }
20781785fc73SJames Collins
20791785fc73SJames Collins            foreach ($MSG as $msg) {
20801785fc73SJames Collins                $hash = md5($msg['msg']);
20819cff245bSJames Collins                if (isset($MSG_shown[$hash]) === true) {
20821785fc73SJames Collins                    continue;
20831785fc73SJames Collins                }
20841785fc73SJames Collins                // skip double messages
20851785fc73SJames Collins
20869cff245bSJames Collins                if (info_msg_allowed($msg) === true) {
20879cff245bSJames Collins                    echo '<div class="' . $msg['lvl'] . '">';
20889cff245bSJames Collins                    echo $msg['msg'];
20899cff245bSJames Collins                    echo '</div>';
20901785fc73SJames Collins                }
20911785fc73SJames Collins
2092a8df40efSJames Collins                $MSG_shown[$hash] = true;
20931785fc73SJames Collins            }
20941785fc73SJames Collins
20951785fc73SJames Collins            unset($GLOBALS['MSG']);
20969cff245bSJames Collins        }//end if
20971785fc73SJames Collins    }
20987ac0a6efSJames Collins
20997ac0a6efSJames Collins    /**
21007ac0a6efSJames Collins     * Dokuwiki version
21017ac0a6efSJames Collins     *
21027ac0a6efSJames Collins     * @return  string        the dw version name
21037ac0a6efSJames Collins     */
21049cff245bSJames Collins    public function dwVersion()
21059cff245bSJames Collins    {
21069cff245bSJames Collins        if (function_exists('getVersionData') === true) {
21077ac0a6efSJames Collins            $version_data = getVersionData();
21089cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
21097ac0a6efSJames Collins                $version_items = explode(' ', $version_data['date']);
21107ac0a6efSJames Collins                if (count($version_items) >= 2) {
21117ac0a6efSJames Collins                    return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
21127ac0a6efSJames Collins                }
21137ac0a6efSJames Collins            }
21147ac0a6efSJames Collins        }
21157ac0a6efSJames Collins
21167ac0a6efSJames Collins        return 'unknown';
21177ac0a6efSJames Collins    }
2118e4c4fb13SJames Collins
2119e4c4fb13SJames Collins    /**
2120e4c4fb13SJames Collins     * Dokuwiki version number
2121e4c4fb13SJames Collins     *
2122e4c4fb13SJames Collins     * @return  string        the dw version date converted to integer
2123e4c4fb13SJames Collins     */
21249cff245bSJames Collins    public function dwVersionNumber()
21259cff245bSJames Collins    {
21269cff245bSJames Collins        if (function_exists('getVersionData') === true) {
2127e4c4fb13SJames Collins            $version_data = getVersionData();
21289cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
2129e4c4fb13SJames Collins                $version_items = explode(' ', $version_data['date']);
2130e4c4fb13SJames Collins                if (count($version_items) >= 1) {
2131e4c4fb13SJames Collins                    return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
2132e4c4fb13SJames Collins                }
2133e4c4fb13SJames Collins            }
2134e4c4fb13SJames Collins        }
2135e4c4fb13SJames Collins
2136e4c4fb13SJames Collins        return 0;
2137e4c4fb13SJames Collins    }
2138a8eebd82SJames Collins}
2139ab45ba71SJames Collins
2140ab45ba71SJames Collinsglobal $TEMPLATE;
214147161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
2142