xref: /template/mikio/mikio.php (revision fd16ea410642413c4bd11e491b82430860f6cc69)
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');
19daf2cd7aSJames Collinsrequire_once('inc/parens-parser.php');
20c165b184SJames Collins
2110b40067Snomadjimbobclass Template
2210b40067Snomadjimbob{
239cff245bSJames Collins    /**
249cff245bSJames Collins     * @var string Template directory path from local FS.
259cff245bSJames Collins     */
26c165b184SJames Collins    public $tplDir  = '';
279cff245bSJames Collins
289cff245bSJames Collins    /**
299cff245bSJames Collins     * @var string Template directory path from web.
309cff245bSJames Collins     */
31c165b184SJames Collins    public $baseDir = '';
329cff245bSJames Collins
339cff245bSJames Collins    /**
349cff245bSJames Collins     * @var array Array of Javascript files to include in footer.
359cff245bSJames Collins     */
369cff245bSJames Collins    public $footerScript = [];
379cff245bSJames Collins
389cff245bSJames Collins    /**
399cff245bSJames Collins     * @var boolean Ignore LESS files.
409cff245bSJames Collins     */
41a8df40efSJames Collins    public $lessIgnored = false;
42c165b184SJames Collins
434f8225e4SJames Collins    /**
444f8225e4SJames Collins     * @var string Notifications from included pages.
454f8225e4SJames Collins     */
464f8225e4SJames Collins    private $includedPageNotifications = '';
474f8225e4SJames Collins
48c165b184SJames Collins
49c165b184SJames Collins    /**
50c165b184SJames Collins     * Class constructor
51c165b184SJames Collins     */
5210b40067Snomadjimbob    public function __construct()
5310b40067Snomadjimbob    {
54c165b184SJames Collins        $this->tplDir  = tpl_incdir();
55c165b184SJames Collins        $this->baseDir = tpl_basedir();
56c165b184SJames Collins
579cff245bSJames Collins        $this->registerHooks();
58c165b184SJames Collins    }
59c165b184SJames Collins
60c165b184SJames Collins    /**
61ab45ba71SJames Collins     * Returns the instance of the class
6247161538SJames Collins     *
63ab45ba71SJames Collins     * @return  Template        class instance
6447161538SJames Collins     */
6547161538SJames Collins    public static function getInstance()
6647161538SJames Collins    {
6747161538SJames Collins        static $instance = null;
6847161538SJames Collins
693a385f2cSJames Collins        if (empty($instance) === true) {
7047161538SJames Collins            $instance = new Template();
7147161538SJames Collins        }
7247161538SJames Collins
7347161538SJames Collins        return $instance;
7447161538SJames Collins    }
7547161538SJames Collins
76ab45ba71SJames Collins
7747161538SJames Collins    /**
78ab45ba71SJames Collins     * Register the themes hooks into Dokuwiki
799cff245bSJames Collins     *
809cff245bSJames Collins     * @return void
81c165b184SJames Collins     */
829cff245bSJames Collins    private function registerHooks()
8310b40067Snomadjimbob    {
84c165b184SJames Collins        global $EVENT_HANDLER;
85c165b184SJames Collins
869cff245bSJames Collins        $events_dispatcher = [
87ab45ba71SJames Collins            'TPL_METAHEADER_OUTPUT'     => 'metaheadersHandler'
889cff245bSJames Collins        ];
89c165b184SJames Collins
90c165b184SJames Collins        foreach ($events_dispatcher as $event => $method) {
91c165b184SJames Collins            $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method);
92c165b184SJames Collins        }
93c165b184SJames Collins    }
94c165b184SJames Collins
95c165b184SJames Collins
96c165b184SJames Collins    /**
97ab45ba71SJames Collins     * Meta handler hook for DokuWiki
98c165b184SJames Collins     *
999cff245bSJames Collins     * @param   \Doku_Event $event DokuWiki Event.
1009cff245bSJames Collins     * @return  void
101c165b184SJames Collins     */
10210b40067Snomadjimbob    public function metaHeadersHandler(\Doku_Event $event)
10310b40067Snomadjimbob    {
104ab45ba71SJames Collins        global $MIKIO_ICONS;
105b5536b07SChris MacMackin        global $conf;
106ab45ba71SJames Collins
107ad182e6dSnomadjimbob        global $MIKIO_TEMPLATE;
108ad182e6dSnomadjimbob        $MIKIO_TEMPLATE = '123';
109ad182e6dSnomadjimbob
1109cff245bSJames Collins        $this->includePage('theme', false, true);
111a8eebd82SJames Collins
1129cff245bSJames Collins        $stylesheets    = [];
1139cff245bSJames Collins        $scripts        = [];
114c165b184SJames Collins
1153a385f2cSJames Collins        if (empty($this->getConf('customTheme')) === false) {
1169cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) {
117a8eebd82SJames Collins                $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less';
118a8eebd82SJames Collins            } else {
1199cff245bSJames Collins                if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) {
120ab45ba71SJames Collins                    $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css';
1212b4583abSJames Collins                }
122a8eebd82SJames Collins            }
1239cff245bSJames Collins            if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) {
124ab45ba71SJames Collins                $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js';
125c165b184SJames Collins            }
126c165b184SJames Collins        }
127c165b184SJames Collins
1283a385f2cSJames Collins        if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) {
1299cff245bSJames Collins            $icons = [];
130ab45ba71SJames Collins            foreach ($MIKIO_ICONS as $icon) {
1319cff245bSJames Collins                if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) {
132ab45ba71SJames Collins                    $icons[] = $icon;
133c165b184SJames Collins
1343a385f2cSJames Collins                    if (empty($icon['css']) === false) {
1359cff245bSJames Collins                        if (strpos($icon['css'], '//') === false) {
136a8eebd82SJames Collins                            $stylesheets[] = $this->baseDir . 'icons/' . $icon['css'];
137ab45ba71SJames Collins                        } else {
138a8eebd82SJames Collins                            $stylesheets[] = $icon['css'];
139ab45ba71SJames Collins                        }
140ab45ba71SJames Collins                    }
141ab45ba71SJames Collins                }
142ab45ba71SJames Collins            }
143ab45ba71SJames Collins            $MIKIO_ICONS = $icons;
144ab45ba71SJames Collins        } else {
145ab45ba71SJames Collins            $MIKIO_ICONS = [];
146ab45ba71SJames Collins        }
147c165b184SJames Collins
1487864545bSChris MacMackin        $scripts[] = $this->baseDir . 'assets/mikio-typeahead.js';
149ab45ba71SJames Collins        $scripts[] = $this->baseDir . 'assets/mikio.js';
150644fd9f9SJames Collins
1519cff245bSJames Collins        if ($this->getConf('useLESS') === true) {
152ab45ba71SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.less';
153644fd9f9SJames Collins        } else {
154644fd9f9SJames Collins            $stylesheets[] = $this->baseDir . 'assets/mikio.css';
155644fd9f9SJames Collins        }
156644fd9f9SJames Collins
157ad182e6dSnomadjimbob        /* MikioPlugin Support */
1589ffe9161Snomadjimbob        if (plugin_load('action', 'mikioplugin') !== null) {
159ad182e6dSnomadjimbob            if ($this->getConf('useLESS') === true) {
160ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.less';
161ad182e6dSnomadjimbob            } else {
162ad182e6dSnomadjimbob                $stylesheets[] = $this->baseDir . 'assets/mikioplugin.css';
163ad182e6dSnomadjimbob            }
164ad182e6dSnomadjimbob        }
165ab45ba71SJames Collins
166ab45ba71SJames Collins        $set = [];
167c165b184SJames Collins        foreach ($stylesheets as $style) {
1689cff245bSJames Collins            if (in_array($style, $set) === false) {
1693a385f2cSJames Collins                if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) {
170ab45ba71SJames Collins                    $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style);
171ab45ba71SJames Collins                }
172ab45ba71SJames Collins
1739cff245bSJames Collins                array_unshift($event->data['link'], [
174c165b184SJames Collins                    'type' => 'text/css',
175c165b184SJames Collins                    'rel'  => 'stylesheet',
176c165b184SJames Collins                    'href' => $style
1779cff245bSJames Collins                ]);
178c165b184SJames Collins            }
179ab45ba71SJames Collins            $set[] = $style;
180ab45ba71SJames Collins        }
181c165b184SJames Collins
182ab45ba71SJames Collins        $set = [];
183c165b184SJames Collins        foreach ($scripts as $script) {
1849cff245bSJames Collins            if (in_array($script, $set) === false) {
1859cff245bSJames Collins                $script_params = [
186c165b184SJames Collins                    'type'  => 'text/javascript',
187c165b184SJames Collins                    '_data' => '',
1888395cdcbSChris MacMackin                    'src'   => $script
1899cff245bSJames Collins                ];
190c1ecb866SJames Collins
191c1ecb866SJames Collins                // equal to or greator than hogfather
192c10b0769SJames Collins                if ($this->dwVersionNumber() >= 20200729 || $this->dwVersionNumber() == 0) {
193c1ecb866SJames Collins                    // greator than hogfather - defer always on
194c10b0769SJames Collins                    if ($this->dwVersionNumber() >= 20200729 || $this->dwVersionNumber() == 0) {
195c1ecb866SJames Collins                        $script_params += ['defer' => 'defer'];
196c1ecb866SJames Collins                    } else {
197c1ecb866SJames Collins                        // hogfather - defer always on unless $conf['defer_js'] is false
1989cff245bSJames Collins                        if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) {
1998395cdcbSChris MacMackin                            $script_params += ['defer' => 'defer'];
2008395cdcbSChris MacMackin                        }
201c1ecb866SJames Collins                    }
202c1ecb866SJames Collins                }
203c1ecb866SJames Collins
2048395cdcbSChris MacMackin                $event->data['script'][] = $script_params;
2059cff245bSJames Collins            }//end if
206ab45ba71SJames Collins            $set[] = $script;
2079cff245bSJames Collins        }//end foreach
208c165b184SJames Collins    }
209c165b184SJames Collins
210c165b184SJames Collins
211c165b184SJames Collins    /**
212a8eebd82SJames Collins     * Print or return the footer meta data
213c165b184SJames Collins     *
2149cff245bSJames Collins     * @param   boolean $print Print the data to buffer.
2159cff245bSJames Collins     * @return  string         HTML footer meta data
216c165b184SJames Collins     */
2179cff245bSJames Collins    public function includeFooterMeta(bool $print = true)
21810b40067Snomadjimbob    {
219a8eebd82SJames Collins        $html = '';
220a8eebd82SJames Collins
221a8eebd82SJames Collins        if (count($this->footerScript) > 0) {
222a8eebd82SJames Collins            $html .= '<script type="text/javascript">function mikioFooterRun() {';
223a8eebd82SJames Collins            foreach ($this->footerScript as $script) {
224a8eebd82SJames Collins                $html .= $script . ';';
225a8eebd82SJames Collins            }
226a8eebd82SJames Collins            $html .= '}</script>';
227a8eebd82SJames Collins        }
228c165b184SJames Collins
229c165b184SJames Collins
2309cff245bSJames Collins        if ($print === true) {
2319cff245bSJames Collins            echo $html;
2329cff245bSJames Collins        }
233a8eebd82SJames Collins        return $html;
234a8eebd82SJames Collins    }
235a8eebd82SJames Collins
23695372bffSJames Collins
23795372bffSJames Collins    // phpcs:disable Squiz.Commenting.FunctionComment.TypeHintMissing
23895372bffSJames Collins
23995372bffSJames Collins
240a8eebd82SJames Collins    /**
241ab45ba71SJames Collins     * Retreive and parse theme configuration options
242c165b184SJames Collins     *
2439cff245bSJames Collins     * @param   string $key     The configuration key to retreive.
2449cff245bSJames Collins     * @param   mixed  $default If key doesn't exist, return this value.
245ab45ba71SJames Collins     * @return  mixed           parsed value of configuration
246c165b184SJames Collins     */
24795372bffSJames Collins    public function getConf(string $key, $default = false)
24810b40067Snomadjimbob    {
249c165b184SJames Collins        $value = tpl_getConf($key, $default);
250c165b184SJames Collins
2513a385f2cSJames Collins        $data = [
2523a385f2cSJames Collins            ['keys' => ['navbarDWMenuType'],                'type' => 'choice',
2533a385f2cSJames Collins                'values' => ['both', 'icons', 'text']
2543a385f2cSJames Collins            ],
2553a385f2cSJames Collins            ['keys' => ['navbarDWMenuCombine'],             'type' => 'choice',
2563a385f2cSJames Collins                'values' => ['combine', 'seperate', 'dropdown']
2573a385f2cSJames Collins            ],
2583a385f2cSJames Collins            ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'],
2593a385f2cSJames Collins                'type' => 'choice',
2603a385f2cSJames Collins                'values' => ['none', 'custom', 'search', 'dokuwiki'],
2613a385f2cSJames Collins                'default' => [
2623a385f2cSJames Collins                    'navbarPosLeft' => 'none',
2633a385f2cSJames Collins                    'navbarPosMiddle' => 'search',
2643a385f2cSJames Collins                    'navbarPosRight' => 'dokuwiki'
2653a385f2cSJames Collins                ]
2663a385f2cSJames Collins            ],
2673a385f2cSJames Collins            ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink',
2683a385f2cSJames Collins                'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile',
2693a385f2cSJames Collins                'navbarItemShowAdmin'
2703a385f2cSJames Collins            ],
2713a385f2cSJames Collins                'type' => 'choice',
2723a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
2733a385f2cSJames Collins            ],
2743a385f2cSJames Collins            ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'],
2753a385f2cSJames Collins                'type' => 'choice',
2763a385f2cSJames Collins                'values' => ['always', 'never']
2773a385f2cSJames Collins            ],
2783a385f2cSJames Collins            ['keys' => ['searchButton'],                    'type' => 'choice',
2793a385f2cSJames Collins                'values' => ['icon', 'text']
2803a385f2cSJames Collins            ],
2813a385f2cSJames Collins            ['keys' => ['breadcrumbPosition', 'youareherePosition'],
2823a385f2cSJames Collins                'type' => 'choice',
2833a385f2cSJames Collins                'values' => ['top', 'hero', 'page', 'none']
2843a385f2cSJames Collins            ],
2853a385f2cSJames Collins            ['keys' => ['youarehereHome'],                  'type' => 'choice',
2863a385f2cSJames Collins                'values' => ['page title', 'home', 'icon', 'none']
2873a385f2cSJames Collins            ],
2883a385f2cSJames Collins            ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'],
2893a385f2cSJames Collins                'type' => 'choice',
2903a385f2cSJames Collins                'values' => ['none', 'logged in user', 'search', 'content', 'tags'],
2913a385f2cSJames Collins                'default' => [
2923a385f2cSJames Collins                    'sidebarLeftRow1' => 'logged in user',
2933a385f2cSJames Collins                    'sidebarLeftRow2' => 'search',
2943a385f2cSJames Collins                    'sidebarLeftRow3' => 'content'
2953a385f2cSJames Collins                ]
2963a385f2cSJames Collins            ],
2973a385f2cSJames Collins            ['keys' => ['pageToolsFloating', 'pageToolsFooter'],
2983a385f2cSJames Collins                'type' => 'choice',
2993a385f2cSJames Collins                'values' => ['always', 'none', 'page editors']
3003a385f2cSJames Collins            ],
3013a385f2cSJames Collins            ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink',
3023a385f2cSJames Collins                'pageToolsShowTop'
3033a385f2cSJames Collins            ],
3043a385f2cSJames Collins                'type' => 'choice',
3053a385f2cSJames Collins                'values' => ['always', 'logged in', 'logged out', 'never']
3063a385f2cSJames Collins            ],
3073a385f2cSJames Collins            ['keys' => ['showNotifications'],               'type' => 'choice',
3082d241f94SJames Collins                'values' => ['admin', 'always', 'none', '', 'never']
3093a385f2cSJames Collins            ],
3103a385f2cSJames Collins            ['keys' => ['licenseType'],                     'type' => 'choice',
3113a385f2cSJames Collins                'values' => ['badge', 'button', 'none']
3123a385f2cSJames Collins            ],
3133a385f2cSJames Collins            ['keys' => ['navbarUseTitleIcon'],              'type' => 'bool'],
3143a385f2cSJames Collins            ['keys' => ['navbarUseTitleText'],              'type' => 'bool'],
3153a385f2cSJames Collins            ['keys' => ['navbarUseTaglineText'],            'type' => 'bool'],
3163a385f2cSJames Collins            ['keys' => ['navbarShowSub'],                   'type' => 'bool'],
3173a385f2cSJames Collins            ['keys' => ['heroTitle'],                       'type' => 'bool'],
3183a385f2cSJames Collins            ['keys' => ['heroImagePropagation'],            'type' => 'bool'],
3193a385f2cSJames Collins            ['keys' => ['breadcrumbPrefix'],                'type' => 'bool'],
3203a385f2cSJames Collins            ['keys' => ['breadcrumbSep'],                   'type' => 'bool'],
3213a385f2cSJames Collins            ['keys' => ['youareherePrefix'],                'type' => 'bool'],
3223a385f2cSJames Collins            ['keys' => ['youarehereSep'],                   'type' => 'bool'],
3233a385f2cSJames Collins            ['keys' => ['sidebarShowLeft'],                 'type' => 'bool'],
3243a385f2cSJames Collins            ['keys' => ['sidebarShowRight'],                'type' => 'bool'],
3253a385f2cSJames Collins            ['keys' => ['tocFull'],                         'type' => 'bool'],
3263a385f2cSJames Collins            ['keys' => ['footerSearch'],                    'type' => 'bool'],
3273a385f2cSJames Collins            ['keys' => ['licenseImageOnly'],                'type' => 'bool'],
3283a385f2cSJames Collins            ['keys' => ['includePageUseACL'],               'type' => 'bool'],
3293a385f2cSJames Collins            ['keys' => ['includePagePropagate'],            'type' => 'bool'],
3303a385f2cSJames Collins            ['keys' => ['youarehereHideHome'],              'type' => 'bool'],
3313a385f2cSJames Collins            ['keys' => ['tagsConsolidate'],                 'type' => 'bool'],
3323a385f2cSJames Collins            ['keys' => ['footerInPage'],                    'type' => 'bool'],
3333a385f2cSJames Collins            ['keys' => ['sidebarMobileDefaultCollapse'],    'type' => 'bool'],
3343a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowLeft'],           'type' => 'bool'],
3353a385f2cSJames Collins            ['keys' => ['sidebarAlwaysShowRight'],          'type' => 'bool'],
3363a385f2cSJames Collins            ['keys' => ['searchUseTypeahead'],              'type' => 'bool'],
33712030b10SJames Collins            ['keys' => ['showLightDark'],                   'type' => 'bool'],
33834d5f19aSJames Collins            ['keys' => ['autoLightDark'],                   'type' => 'bool'],
3393a385f2cSJames Collins            ['keys' => ['youarehereShowLast'],              'type' => 'int'],
3403a385f2cSJames Collins
3413a385f2cSJames Collins            ['keys' => ['iconTag'],                         'type' => 'string'],
3423a385f2cSJames Collins            ['keys' => ['customTheme'],                     'type' => 'string'],
3433a385f2cSJames Collins            ['keys' => ['navbarCustomMenuText'],            'type' => 'string'],
3443a385f2cSJames Collins            ['keys' => ['breadcrumbPrefixText'],            'type' => 'string'],
3453a385f2cSJames Collins            ['keys' => ['breadcrumbSepText'],               'type' => 'string'],
3463a385f2cSJames Collins            ['keys' => ['youareherePrefixText'],            'type' => 'string'],
3473a385f2cSJames Collins            ['keys' => ['youarehereSepText'],               'type' => 'string'],
348daf2cd7aSJames Collins            ['keys' => ['footerPageInfoText'],              'type' => 'string'],
3493a385f2cSJames Collins            ['keys' => ['footerCustomMenuText'],            'type' => 'string'],
3503a385f2cSJames Collins            ['keys' => ['brandURLGuest'],                   'type' => 'string'],
3513a385f2cSJames Collins            ['keys' => ['brandURLUser'],                    'type' => 'string'],
3523a385f2cSJames Collins
3533a385f2cSJames Collins            ['keys' => ['useLESS'],                         'type' => 'less'],
3543a385f2cSJames Collins        ];
3553a385f2cSJames Collins
3563a385f2cSJames Collins        foreach ($data as $row) {
3573a385f2cSJames Collins            // does not check case....
3583a385f2cSJames Collins            if (in_array($key, $row['keys']) === true) {
35995372bffSJames Collins                if (array_key_exists('type', $row) === true) {
3603a385f2cSJames Collins                    switch ($row['type']) {
3613a385f2cSJames Collins                        case 'bool':
3623a385f2cSJames Collins                            return (bool) $value;
3633a385f2cSJames Collins                        case 'int':
3643a385f2cSJames Collins                            return (int) $value;
3653a385f2cSJames Collins                        case 'string':
3663a385f2cSJames Collins                            return $value;
3673a385f2cSJames Collins                        case 'less':
36829118ed7SJames Collins                            $value = (bool) $value;
369a8df40efSJames Collins                            $lessAvailable = false;
370c963c68cSJames Collins
371c963c68cSJames Collins                            // search for less library
372c963c68cSJames Collins                            $path = '/vendor/marcusschwarz/lesserphp/lessc.inc.php';
373c963c68cSJames Collins                            if (($lessAvailable = file_exists('.' . $path)) !== true) {
374c963c68cSJames Collins                                for ($i = 0; $i < 6; $i++) {
375c963c68cSJames Collins                                    if (($lessAvailable = file_exists($_SERVER['DOCUMENT_ROOT'] . $path)) === true) {
376c963c68cSJames Collins                                        break;
377a8df40efSJames Collins                                    }
378a8df40efSJames Collins
379c963c68cSJames Collins                                    $path = '/..' . $path;
380c963c68cSJames Collins                                }
381c963c68cSJames Collins
382c963c68cSJames Collins                                if ($lessAvailable !== true) {
383c963c68cSJames Collins                                    $path = '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
384c963c68cSJames Collins                                    for ($i = 0; $i < 6; $i++) {
38554915114SJames Collins                                        if (
38654915114SJames Collins                                            ($lessAvailable = file_exists(
38754915114SJames Collins                                                $_SERVER['DOCUMENT_ROOT'] . $path
38854915114SJames Collins                                            )) === true
38954915114SJames Collins                                        ) {
390c963c68cSJames Collins                                            break;
391c963c68cSJames Collins                                        }
392c963c68cSJames Collins
393c963c68cSJames Collins                                        $path = '/..' . $path;
394c963c68cSJames Collins                                    }
395c963c68cSJames Collins                                }
396c963c68cSJames Collins                            }//end if
397c963c68cSJames Collins
398a8df40efSJames Collins                            // check for ctype extensions
3999cff245bSJames Collins                            if (function_exists('ctype_digit') === false) {
400a8df40efSJames Collins                                $lessAvailable = false;
401a8df40efSJames Collins                            }
402a8df40efSJames Collins
4039cff245bSJames Collins                            if ($value === true && $lessAvailable === false) {
404a8df40efSJames Collins                                $this->lessIgnored = true;
40529118ed7SJames Collins                                $value = false;
40629118ed7SJames Collins                            }
4073a385f2cSJames Collins
4083a385f2cSJames Collins                            return $value;
4099cff245bSJames Collins                    }//end switch
4103a385f2cSJames Collins                }//end if
4113a385f2cSJames Collins
4123a385f2cSJames Collins                if (in_array($value, $row['values']) === true) {
4133a385f2cSJames Collins                    return $value;
4143a385f2cSJames Collins                }
4153a385f2cSJames Collins
4163a385f2cSJames Collins                if (array_key_exists('default', $row) === true) {
4173a385f2cSJames Collins                    if (is_array($row['default']) === true) {
4183a385f2cSJames Collins                        if (array_key_exists($key, $row['default']) === true) {
4193a385f2cSJames Collins                            return $row['default'][$key];
4203a385f2cSJames Collins                        }
4213a385f2cSJames Collins                    } else {
4223a385f2cSJames Collins                        return $row['default'];
4233a385f2cSJames Collins                    }
4243a385f2cSJames Collins                }
4253a385f2cSJames Collins
4263a385f2cSJames Collins                return reset($row['values']);
4273a385f2cSJames Collins            }//end if
4283a385f2cSJames Collins        }//end foreach
429c165b184SJames Collins
430c165b184SJames Collins        return $value;
431c165b184SJames Collins    }
432c165b184SJames Collins
433c165b184SJames Collins
43495372bffSJames Collins    // phpcs:enable
43595372bffSJames Collins
43695372bffSJames Collins
437c165b184SJames Collins    /**
438a8eebd82SJames Collins     * Check if a page exist in directory or namespace
439c165b184SJames Collins     *
4409cff245bSJames Collins     * @param   string $page Page/namespace to search.
441a8eebd82SJames Collins     * @return  boolean      if page exists
442c165b184SJames Collins     */
4439cff245bSJames Collins    public function pageExists(string $page)
44410b40067Snomadjimbob    {
445ab45ba71SJames Collins        ob_start();
446a8eebd82SJames Collins        tpl_includeFile($page . '.html');
447ab45ba71SJames Collins        $html = ob_get_contents();
448ab45ba71SJames Collins        ob_end_clean();
449a8eebd82SJames Collins
4503a385f2cSJames Collins        if (empty($html) === false) {
4519cff245bSJames Collins            return true;
4529cff245bSJames Collins        }
453a8eebd82SJames Collins
454a8eebd82SJames Collins        $useACL = $this->getConf('includePageUseACL');
455a8eebd82SJames Collins        $propagate = $this->getConf('includePagePropagate');
456a8eebd82SJames Collins
4579cff245bSJames Collins        if ($propagate === true) {
4589cff245bSJames Collins            if (page_findnearest($page, $useACL) !== false) {
4599cff245bSJames Collins                return true;
4609cff245bSJames Collins            }
4619cff245bSJames Collins        } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) {
4629cff245bSJames Collins            return true;
463ab45ba71SJames Collins        }
464ab45ba71SJames Collins
4659cff245bSJames Collins        return false;
466ab45ba71SJames Collins    }
467ab45ba71SJames Collins
468a8eebd82SJames Collins
469c165b184SJames Collins    /**
470a8eebd82SJames Collins     * Print or return page from directory or namespace
4712b4583abSJames Collins     *
4729cff245bSJames Collins     * @param   string  $page         Page/namespace to include.
4739cff245bSJames Collins     * @param   boolean $print        Print content.
4749cff245bSJames Collins     * @param   boolean $parse        Parse content before printing/returning.
4759cff245bSJames Collins     * @param   string  $classWrapper Wrap page in a div with class.
476ab45ba71SJames Collins     * @return  string                contents of page found
4772b4583abSJames Collins     */
4789cff245bSJames Collins    public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '')
4792b4583abSJames Collins    {
480a8eebd82SJames Collins        ob_start();
481a8eebd82SJames Collins        tpl_includeFile($page . '.html');
482a8eebd82SJames Collins        $html = ob_get_contents();
483a8eebd82SJames Collins        ob_end_clean();
484a8eebd82SJames Collins
4853a385f2cSJames Collins        if (empty($html) === true) {
4864f8225e4SJames Collins            global $MSG;
4874f8225e4SJames Collins
488a8eebd82SJames Collins            $useACL = $this->getConf('includePageUseACL');
489a8eebd82SJames Collins            $propagate = $this->getConf('includePagePropagate');
490ab45ba71SJames Collins            $html = '';
4912b4583abSJames Collins
4924f8225e4SJames Collins            ob_start();
493ab45ba71SJames Collins            $html = tpl_include_page($page, false, $propagate, $useACL);
4944f8225e4SJames Collins            $this->includedPageNotifications .= ob_get_contents();
4954f8225e4SJames Collins            ob_end_clean();
496ab45ba71SJames Collins        }
4972b4583abSJames Collins
4983a385f2cSJames Collins        if (empty($html) === false && $parse === true) {
499ab45ba71SJames Collins            $html = $this->parseContent($html);
500ab45ba71SJames Collins        }
5012b4583abSJames Collins
5023a385f2cSJames Collins        if (empty($classWrapper) === false && empty($html) === false) {
5039cff245bSJames Collins            $html = '<div class="' . $classWrapper . '">' . $html . '</div>';
5049cff245bSJames Collins        }
5052b4583abSJames Collins
5069cff245bSJames Collins        if ($print === true) {
5079cff245bSJames Collins            echo $html;
5089cff245bSJames Collins        }
509ab45ba71SJames Collins        return $html;
5102b4583abSJames Collins    }
5112b4583abSJames Collins
512a8eebd82SJames Collins
513a8eebd82SJames Collins    /**
514a8eebd82SJames Collins     * Print or return logged in user information
515a8eebd82SJames Collins     *
5169cff245bSJames Collins     * @param   boolean $print Print content.
517a8eebd82SJames Collins     * @return  string         user information
518a8eebd82SJames Collins     */
5199cff245bSJames Collins    public function includeLoggedIn(bool $print = true)
52010b40067Snomadjimbob    {
521a8eebd82SJames Collins        $html = '';
522a8eebd82SJames Collins
5239cff245bSJames Collins        if (empty($_SERVER['REMOTE_USER']) === false) {
524a8eebd82SJames Collins            $html .= '<div class="mikio-user-info">';
525a8eebd82SJames Collins            ob_start();
526a8eebd82SJames Collins            tpl_userinfo();
527a8eebd82SJames Collins            $html .= ob_get_contents();
528a8eebd82SJames Collins            ob_end_clean();
529a8eebd82SJames Collins            $html .= '</div>';
5302b4583abSJames Collins        }
531a8eebd82SJames Collins
5329cff245bSJames Collins        if ($print === true) {
5339cff245bSJames Collins            echo $html;
5349cff245bSJames Collins        }
535a8eebd82SJames Collins        return $html;
5362b4583abSJames Collins    }
5372b4583abSJames Collins
5382b4583abSJames Collins
539a8eebd82SJames Collins    /**
540a8eebd82SJames Collins     * Print or return DokuWiki Menu
541a8eebd82SJames Collins     *
5429cff245bSJames Collins     * @param   boolean $print Print content.
543a8eebd82SJames Collins     * @return  string         contents of the menu
544a8eebd82SJames Collins     */
5459cff245bSJames Collins    public function includeDWMenu(bool $print = true)
54610b40067Snomadjimbob    {
5472b4583abSJames Collins        global $lang;
5482b4583abSJames Collins        global $USERINFO;
549c165b184SJames Collins
5509cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
551a8eebd82SJames Collins        $html = '<ul class="mikio-nav">';
5522b4583abSJames Collins
553ab45ba71SJames Collins        $pageToolsMenu = [];
554ab45ba71SJames Collins        $siteToolsMenu = [];
555ab45ba71SJames Collins        $userToolsMenu = [];
556c165b184SJames Collins
557ab45ba71SJames Collins        $showIcons  = ($this->getConf('navbarDWMenuType') != 'text');
558ab45ba71SJames Collins        $showText   = ($this->getConf('navbarDWMenuType') != 'icons');
559ab45ba71SJames Collins        $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate');
5602b4583abSJames Collins
5612b4583abSJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
5622b4583abSJames Collins        foreach ($items as $item) {
5639cff245bSJames Collins            if ($item->getType() !== 'top') {
564ab45ba71SJames Collins                $itemHtml = '';
5652b4583abSJames Collins
566905b27c6SJames Collins                $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5679cff245bSJames Collins                if (
5683a385f2cSJames Collins                    $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5693a385f2cSJames Collins                    (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5703a385f2cSJames Collins                    (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5719cff245bSJames Collins                ) {
572*fd16ea41SJames Collins                    $title = isset($attr['title']) && $attr['title'] !== 0 ? $attr['title'] : $item->getTitle();
573*fd16ea41SJames Collins
5749cff245bSJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') .
575*fd16ea41SJames Collins                        ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $title . '"' . (isset($attr['accesskey']) && $attr['accesskey'] !== '' ? ' accesskey="' . $attr['accesskey'] . '"' : '') . '>';
5769cff245bSJames Collins                    if ($showIcons === true) {
5779cff245bSJames Collins                        $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
5789cff245bSJames Collins                    }
5799cff245bSJames Collins                    if ($showText === true || $isDropDown === true) {
5809cff245bSJames Collins                        $itemHtml .= '<span>' . $item->getLabel() . '</span>';
5819cff245bSJames Collins                    }
582ab45ba71SJames Collins                    $itemHtml .= '</a>';
583ab45ba71SJames Collins
584ab45ba71SJames Collins                    $pageToolsMenu[] = $itemHtml;
5852b4583abSJames Collins                }
5869cff245bSJames Collins            }//end if
5879cff245bSJames Collins        }//end foreach
5882b4583abSJames Collins
589ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action');
590ab45ba71SJames Collins        foreach ($items as $item) {
591ab45ba71SJames Collins            $itemHtml = '';
5922b4583abSJames Collins
593905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
5949cff245bSJames Collins            if (
5953a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
5963a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
5973a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
5989cff245bSJames Collins            ) {
5999cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' .
6009cff245bSJames Collins                    $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
6019cff245bSJames Collins                if ($showIcons === true) {
6029cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
6039cff245bSJames Collins                }
6049cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
6059cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
6069cff245bSJames Collins                }
607ab45ba71SJames Collins                $itemHtml .= '</a>';
6082b4583abSJames Collins
609ab45ba71SJames Collins                $siteToolsMenu[] = $itemHtml;
6102b4583abSJames Collins            }
6119cff245bSJames Collins        }//end foreach
6122b4583abSJames Collins
613ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\UserMenu())->getItems('action');
614ab45ba71SJames Collins        foreach ($items as $item) {
615ab45ba71SJames Collins            $itemHtml = '';
616ab45ba71SJames Collins
617905b27c6SJames Collins            $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType()));
6189cff245bSJames Collins            if (
6193a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
6203a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
6213a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false))
6229cff245bSJames Collins            ) {
6239cff245bSJames Collins                $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' .
6249cff245bSJames Collins                $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">';
6259cff245bSJames Collins                if ($showIcons === true) {
6269cff245bSJames Collins                    $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>';
6279cff245bSJames Collins                }
6289cff245bSJames Collins                if ($showText === true || $isDropDown === true) {
6299cff245bSJames Collins                    $itemHtml .= '<span>' . $item->getLabel() . '</span>';
6309cff245bSJames Collins                }
631ab45ba71SJames Collins                $itemHtml .= '</a>';
632ab45ba71SJames Collins
633ab45ba71SJames Collins                $userToolsMenu[] = $itemHtml;
634ab45ba71SJames Collins            }
6359cff245bSJames Collins        }//end foreach
636ab45ba71SJames Collins
637ab45ba71SJames Collins
638ab45ba71SJames Collins        switch ($this->getConf('navbarDWMenuCombine')) {
639ab45ba71SJames Collins            case 'dropdown':
640ab45ba71SJames Collins                $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">';
6419cff245bSJames Collins                $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button"
6429cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6439cff245bSJames Collins                ($showIcons === true ? $this->mikioInlineIcon('file') : '') .
6449cff245bSJames Collins                ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] .
6459cff245bSJames Collins                '</span>') . '</a>';
646a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
647ab45ba71SJames Collins
648ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
649ab45ba71SJames Collins                    $html .= $item;
650ab45ba71SJames Collins                }
651ab45ba71SJames Collins
652ab45ba71SJames Collins                $html .= '</div>';
653ab45ba71SJames Collins                $html .= '</li>';
654ab45ba71SJames Collins
655a8eebd82SJames Collins                $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">';
6569cff245bSJames Collins                $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button"
6579cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6589cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('gear') : '') .
6599cff245bSJames Collins                    ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' .
6609cff245bSJames Collins                    $lang['site_tools'] . '</span>') . '</a>';
661a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
662ab45ba71SJames Collins
663ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
664ab45ba71SJames Collins                    $html .= $item;
665ab45ba71SJames Collins                }
666ab45ba71SJames Collins
667ab45ba71SJames Collins                $html .= '</div>';
668ab45ba71SJames Collins                $html .= '</li>';
669ab45ba71SJames Collins
670a8eebd82SJames Collins                $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">';
6719cff245bSJames Collins                $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button"
6729cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
6739cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('user') : '') .
6749cff245bSJames Collins                    ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' .
6759cff245bSJames Collins                    $lang['user_tools'] . '</span>') . '</a>';
676a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
677ab45ba71SJames Collins
678ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
679ab45ba71SJames Collins                    $html .= $item;
680ab45ba71SJames Collins                }
681ab45ba71SJames Collins
682ab45ba71SJames Collins                $html .= '</div>';
683ab45ba71SJames Collins                $html .= '</li>';
684ab45ba71SJames Collins
685ab45ba71SJames Collins                break;
686ab45ba71SJames Collins
687ab45ba71SJames Collins            case 'combine':
688ab45ba71SJames Collins                $html .= '<li class="mikio-nav-dropdown">';
6899cff245bSJames Collins                $html .= '<a class="mikio-nav-link" href="#">' .
6909cff245bSJames Collins                    ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') .
6919cff245bSJames Collins                    ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' .
6929cff245bSJames Collins                    tpl_getLang('tools-menu') . '</span>') . '</a>';
693a8eebd82SJames Collins                $html .= '<div class="mikio-dropdown closed">';
694ab45ba71SJames Collins
695ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>';
696ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
697ab45ba71SJames Collins                    $html .= $item;
698ab45ba71SJames Collins                }
699ab45ba71SJames Collins
700ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
701ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>';
702ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
703ab45ba71SJames Collins                    $html .= $item;
704ab45ba71SJames Collins                }
705ab45ba71SJames Collins
706ab45ba71SJames Collins                $html .= '<div class="mikio-dropdown-divider"></div>';
707ab45ba71SJames Collins                $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>';
708ab45ba71SJames Collins                foreach ($userToolsMenu as $item) {
709ab45ba71SJames Collins                    $html .= $item;
710ab45ba71SJames Collins                }
711ab45ba71SJames Collins
712ab45ba71SJames Collins                $html .= '</div>';
713ab45ba71SJames Collins                $html .= '</li>';
714ab45ba71SJames Collins                break;
715ab45ba71SJames Collins
716ab45ba71SJames Collins            default:    // seperate
717ab45ba71SJames Collins                foreach ($siteToolsMenu as $item) {
718a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
719ab45ba71SJames Collins                }
720ab45ba71SJames Collins
721ab45ba71SJames Collins                foreach ($pageToolsMenu as $item) {
722a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
723a8eebd82SJames Collins                }
724a8eebd82SJames Collins
725a8eebd82SJames Collins                foreach ($userToolsMenu as $item) {
726a8eebd82SJames Collins                    $html .= '<li class="mikio-nav-item">' . $item . '</li>';
727ab45ba71SJames Collins                }
728ab45ba71SJames Collins
729ab45ba71SJames Collins                break;
7309cff245bSJames Collins        }//end switch
731ab45ba71SJames Collins
7323a3ece10SJames Collins        $translation = plugin_load('helper', 'translation');
7333a3ece10SJames Collins        if ($translation !== null) {
7343a3ece10SJames Collins            $html .= '<li id="mikio__translate" class="mikio-nav-dropdown">';
7353a3ece10SJames Collins            $html .= '<a id="mikio_dropdown_translate" class="nav-link dropdown-toggle" href="#" role="button"
7363a3ece10SJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' .
7373a3ece10SJames Collins                $this->mikioInlineIcon('language') .
7383a3ece10SJames Collins                 '</a>';
7393a3ece10SJames Collins            $html .= '<div class="mikio-dropdown closed">';
7403a3ece10SJames Collins
7413a3ece10SJames Collins                $html .= $translation->showTranslations();
7423a3ece10SJames Collins
7433a3ece10SJames Collins            $html .= '</div>';
7443a3ece10SJames Collins            $html .= '</li>';
7453a3ece10SJames Collins        }
7463a3ece10SJames Collins
74712030b10SJames Collins        if ($this->getConf('showLightDark') === true) {
748d0fba6d1SJames Collins            $autoLightDark = $this->getConf('autoLightDark');
7499e41d878SJames Collins            $html .= '<li class="mikio-darklight">
7509e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' .
751d0fba6d1SJames Collins            ($autoLightDark === true ? $this->mikioInlineIcon('sunmoon', 'mikio-darklight-auto') : '') .
7529e41d878SJames Collins            $this->mikioInlineIcon('sun', 'mikio-darklight-light') .
7539e41d878SJames Collins            $this->mikioInlineIcon('moon', 'mikio-darklight-dark') .
7549e41d878SJames Collins            '</a></li>';
75512030b10SJames Collins        }
75612030b10SJames Collins
757ab45ba71SJames Collins        $html .= '</ul>';
758ab45ba71SJames Collins
7599cff245bSJames Collins        if ($print === true) {
7609cff245bSJames Collins            echo $html;
7619cff245bSJames Collins        }
762a8eebd82SJames Collins        return $html;
763a8eebd82SJames Collins    }
764a8eebd82SJames Collins
765a8eebd82SJames Collins
766a8eebd82SJames Collins    /**
767a8eebd82SJames Collins     * Create a nav element from a string. <uri>|<title>;
768a8eebd82SJames Collins     *
7699cff245bSJames Collins     * @param string $str String to generate nav.
770a8eebd82SJames Collins     * @return string     nav elements generated
771a8eebd82SJames Collins     */
7729cff245bSJames Collins    public function stringToNav(string $str)
77310b40067Snomadjimbob    {
774a8eebd82SJames Collins        $html = '';
775a8eebd82SJames Collins
7763a385f2cSJames Collins        if (empty($str) === false) {
777a8eebd82SJames Collins            $items = explode(';', $str);
778a8eebd82SJames Collins            if (count($items) > 0) {
779a8eebd82SJames Collins                $html .= '<ul class="mikio-nav">';
780a8eebd82SJames Collins                foreach ($items as $item) {
781a8eebd82SJames Collins                    $parts = explode('|', $item);
782a8eebd82SJames Collins                    if ($parts > 1) {
7839cff245bSJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' .
7849cff245bSJames Collins                            strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) .
7859cff245bSJames Collins                            '</a></li>';
786a8eebd82SJames Collins                    }
787a8eebd82SJames Collins                }
788a8eebd82SJames Collins                $html .= '</ul>';
789a8eebd82SJames Collins            }
7902b4583abSJames Collins        }
7912b4583abSJames Collins
792ab45ba71SJames Collins        return $html;
7932b4583abSJames Collins    }
7942b4583abSJames Collins
795a8eebd82SJames Collins    /**
796ab45ba71SJames Collins     * print or return the main navbar
7972b4583abSJames Collins     *
7989cff245bSJames Collins     * @param boolean $print   Print the navbar.
7999cff245bSJames Collins     * @param boolean $showSub Include the sub navbar.
800ab45ba71SJames Collins     * @return string          generated content
8012b4583abSJames Collins     */
8029cff245bSJames Collins    public function includeNavbar(bool $print = true, bool $showSub = false)
80310b40067Snomadjimbob    {
804b39ad16dSJames Collins        global $conf, $USERINFO;
805d3d7d2b7SJames Collins
806d3d7d2b7SJames Collins        $homeUrl = wl();
807d3d7d2b7SJames Collins
8089cff245bSJames Collins        if (plugin_isdisabled('showpageafterlogin') === false) {
809d3d7d2b7SJames Collins            $p = &plugin_load('action', 'showpageafterlogin');
8103a385f2cSJames Collins            if (empty($p) === false) {
8119cff245bSJames Collins                if (is_array($USERINFO) === true && count($USERINFO) > 0) {
812d3d7d2b7SJames Collins                    $homeUrl = wl($p->getConf('page_after_login'));
813d3d7d2b7SJames Collins                }
814d3d7d2b7SJames Collins            }
815b39ad16dSJames Collins        } else {
8169cff245bSJames Collins            if (is_array($USERINFO) === true && count($USERINFO) > 0) {
817b39ad16dSJames Collins                $url = $this->getConf('brandURLUser');
818b39ad16dSJames Collins                if (strlen($url) > 0) {
819b39ad16dSJames Collins                    $homeUrl = $url;
820d3d7d2b7SJames Collins                }
821b39ad16dSJames Collins            } else {
822b39ad16dSJames Collins                $url = $this->getConf('brandURLGuest');
823b39ad16dSJames Collins                if (strlen($url) > 0) {
824b39ad16dSJames Collins                    $homeUrl = $url;
825b39ad16dSJames Collins                }
826b39ad16dSJames Collins            }
827b39ad16dSJames Collins        }
828d3d7d2b7SJames Collins
829ab45ba71SJames Collins        $html = '';
83047161538SJames Collins
8319cff245bSJames Collins        $html .= '<nav class="mikio-navbar'  . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') .
8329cff245bSJames Collins            '">';
833f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
834d3d7d2b7SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">';
8359cff245bSJames Collins        if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) {
836ab45ba71SJames Collins            // Brand image
8379cff245bSJames Collins            if ($this->getConf('navbarUseTitleIcon') === true) {
8389cff245bSJames Collins                $logo = $this->getMediaFile('logo', false);
8399cff245bSJames Collins                ;
8403a385f2cSJames Collins                if (empty($logo) === false) {
841f0241fc4SJames Collins                    $width = $this->getConf('navbarTitleIconWidth');
842f0241fc4SJames Collins                    $height = $this->getConf('navbarTitleIconHeight');
843f0241fc4SJames Collins                    $styles = '';
844f0241fc4SJames Collins
845f0241fc4SJames Collins                    if (strlen($width) > 0 || strlen($height) > 0) {
8469cff245bSJames Collins                        if (ctype_digit($width) === true) {
847f0241fc4SJames Collins                            $styles .= 'max-width:' . intval($width) . 'px;';
8489cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) {
849f0241fc4SJames Collins                            $styles .= 'max-width:' . $width . ';';
8509cff245bSJames Collins                        } elseif (strcasecmp($width, 'none') === 0) {
8517a92c19bSJames Collins                            $styles .= 'max-width:none;';
852f0241fc4SJames Collins                        }
853f0241fc4SJames Collins
8549cff245bSJames Collins                        if (ctype_digit($height) === true) {
855f0241fc4SJames Collins                            $styles .= 'max-height:' . intval($height) . 'px;';
8569cff245bSJames Collins                        } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) {
857f0241fc4SJames Collins                            $styles .= 'max-height:' . $height . ';';
8589cff245bSJames Collins                        } elseif (strcasecmp($height, 'none') === 0) {
8597a92c19bSJames Collins                            $styles .= 'max-height:none;';
860f0241fc4SJames Collins                        }
861f0241fc4SJames Collins
862f0241fc4SJames Collins                        if (strlen($styles) > 0) {
863f0241fc4SJames Collins                            $styles = ' style="' . $styles . '"';
864f0241fc4SJames Collins                        }
8659cff245bSJames Collins                    }//end if
866f0241fc4SJames Collins
867f0241fc4SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>';
8689cff245bSJames Collins                }//end if
8699cff245bSJames Collins            }//end if
870ab45ba71SJames Collins
871ab45ba71SJames Collins            // Brand title
8729cff245bSJames Collins            if ($this->getConf('navbarUseTitleText') === true) {
873ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
874a8eebd82SJames Collins                $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>';
8759cff245bSJames Collins                if ($this->getConf('navbarUseTaglineText') === true) {
876a8eebd82SJames Collins                    $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>';
877ab45ba71SJames Collins                }
878ab45ba71SJames Collins                $html .= '</div>';
879ab45ba71SJames Collins            }
8809cff245bSJames Collins        }//end if
881ab45ba71SJames Collins        $html .= '</a>';
882660b2c71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>';
883ab45ba71SJames Collins
884ab45ba71SJames Collins        // Menus
885ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
886ab45ba71SJames Collins
8879cff245bSJames Collins        $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'),
8889cff245bSJames Collins            $this->getConf('navbarPosRight', 'none')
8899cff245bSJames Collins        ];
890a8eebd82SJames Collins        foreach ($menus as $menuType) {
891a8eebd82SJames Collins            switch ($menuType) {
892a8eebd82SJames Collins                case 'custom':
893a8eebd82SJames Collins                    $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', ''));
894a8eebd82SJames Collins                    break;
895a8eebd82SJames Collins                case 'search':
896ab45ba71SJames Collins                    $html .= '<div class="mikio-nav-item">';
897ab45ba71SJames Collins                    $html .= $this->includeSearch(false);
898ab45ba71SJames Collins                    $html .= '</div>';
899a8eebd82SJames Collins                    break;
900a8eebd82SJames Collins                case 'dokuwiki':
9019cff245bSJames Collins                    $html .= $this->includeDWMenu(false);
902a8eebd82SJames Collins                    break;
903a8eebd82SJames Collins            }
904a8eebd82SJames Collins        }
905ab45ba71SJames Collins
906ab45ba71SJames Collins        $html .= '</div>';
907f8039bf2SJames Collins        $html .= '</div>';
908ab45ba71SJames Collins        $html .= '</nav>';
909ab45ba71SJames Collins
910a8eebd82SJames Collins        // Sub Navbar
9119cff245bSJames Collins        if ($showSub === true) {
9129cff245bSJames Collins            $sub = $this->includePage('submenu', false);
9133a385f2cSJames Collins            if (empty($sub) === false) {
9149cff245bSJames Collins                $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>';
9159cff245bSJames Collins            }
916ab45ba71SJames Collins        }
917ab45ba71SJames Collins
9189cff245bSJames Collins        if ($print === true) {
9199cff245bSJames Collins            echo $html;
9209cff245bSJames Collins        }
921ab45ba71SJames Collins        return $html;
922ab45ba71SJames Collins    }
923ab45ba71SJames Collins
924ab45ba71SJames Collins
925a8eebd82SJames Collins    /**
926a8eebd82SJames Collins     * Is there a sidebar
927a8eebd82SJames Collins     *
9289cff245bSJames Collins     * @param   string $prefix Sidebar prefix to use when searching.
929a8eebd82SJames Collins     * @return  boolean        if sidebar exists
930a8eebd82SJames Collins     */
9319cff245bSJames Collins    public function sidebarExists(string $prefix = '')
93210b40067Snomadjimbob    {
933a8eebd82SJames Collins        global $conf;
934a8eebd82SJames Collins
9353a385f2cSJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9369cff245bSJames Collins            $prefix = '';
9379cff245bSJames Collins        }
938a8eebd82SJames Collins
939a8eebd82SJames Collins        return $this->pageExists($conf['sidebar' . $prefix]);
940a8eebd82SJames Collins    }
941a8eebd82SJames Collins
942a8eebd82SJames Collins
943a8eebd82SJames Collins    /**
944ab45ba71SJames Collins     * Print or return the sidebar content
945ab45ba71SJames Collins     *
9469cff245bSJames Collins     * @param   string  $prefix Sidebar prefix to use when searching.
9479cff245bSJames Collins     * @param   boolean $print  Print the generated content to the output buffer.
9489cff245bSJames Collins     * @param   boolean $parse  Parse the content.
949ab45ba71SJames Collins     * @return  string          generated content
950ab45ba71SJames Collins     */
9519cff245bSJames Collins    public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true)
95210b40067Snomadjimbob    {
953ab45ba71SJames Collins        global $conf, $ID;
954ab45ba71SJames Collins
955ab45ba71SJames Collins        $html = '';
956ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
957ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
958ab45ba71SJames Collins
9593a385f2cSJames Collins        if (empty($confPrefix) === true) {
9609cff245bSJames Collins            $confPrefix = 'Left';
9619cff245bSJames Collins        }
9621cdedf28SJames Collins        if (strcasecmp($prefix, 'left') === 0) {
9639cff245bSJames Collins            $prefix = '';
9649cff245bSJames Collins        }
965ab45ba71SJames Collins
9661cdedf28SJames Collins        $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar'];
967ab45ba71SJames Collins
9689cff245bSJames Collins        if (
9699cff245bSJames Collins            $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false &&
9701cdedf28SJames Collins            p_get_metadata($ID, 'nosidebar', false) === null
9719cff245bSJames Collins        ) {
9729cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'header', false);
9733a385f2cSJames Collins            if (empty($content) === false) {
9749cff245bSJames Collins                $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
9759cff245bSJames Collins            }
976ab45ba71SJames Collins
9773a385f2cSJames Collins            if (empty($prefix) === true) {
9789cff245bSJames Collins                $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'),
9799cff245bSJames Collins                    $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4')
9809cff245bSJames Collins                ];
981ab45ba71SJames Collins
982a8eebd82SJames Collins                foreach ($rows as $row) {
983a8eebd82SJames Collins                    switch ($row) {
984a8eebd82SJames Collins                        case 'search':
9859cff245bSJames Collins                            $html .= $this->includeSearch(false);
986a8eebd82SJames Collins                            break;
987a8eebd82SJames Collins                        case 'logged in user':
9889cff245bSJames Collins                            $html .= $this->includeLoggedIn(false);
989a8eebd82SJames Collins                            break;
990a8eebd82SJames Collins                        case 'content':
9919cff245bSJames Collins                            $content = $this->includePage($sidebarPage, false);
9923a385f2cSJames Collins                            if (empty($content) === false) {
9939cff245bSJames Collins                                $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
9949cff245bSJames Collins                            }
995a8eebd82SJames Collins                            break;
996a8eebd82SJames Collins                        case 'tags':
997a8eebd82SJames Collins                            $html .= '<div class="mikio-tags"></div>';
998a8eebd82SJames Collins                    }
999a8eebd82SJames Collins                }
1000a8eebd82SJames Collins            } else {
10019cff245bSJames Collins                $content = $this->includePage($sidebarPage, false);
10023a385f2cSJames Collins                if (empty($content) === false) {
10039cff245bSJames Collins                    $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
10049cff245bSJames Collins                }
10059cff245bSJames Collins            }//end if
10069cff245bSJames Collins
10079cff245bSJames Collins            $content = $this->includePage($sidebarPage . 'footer', false);
10083a385f2cSJames Collins            if (empty($content) === false) {
10099cff245bSJames Collins                $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
10109cff245bSJames Collins            }
10119cff245bSJames Collins        }//end if
10129cff245bSJames Collins
10133a385f2cSJames Collins        if (empty($html) === true) {
10143a385f2cSJames Collins            if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) {
10159cff245bSJames Collins                $html = '&nbsp;';
10169cff245bSJames Collins            }
10179cff245bSJames Collins            if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) {
10189cff245bSJames Collins                $html = '&nbsp;';
10199cff245bSJames Collins            }
1020a8eebd82SJames Collins        }
1021ab45ba71SJames Collins
10223a385f2cSJames Collins        if (empty($html) === false) {
10231cdedf28SJames Collins            $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) .
10249cff245bSJames Collins                '"><a class="mikio-sidebar-toggle' .
10259cff245bSJames Collins                ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' .
10269cff245bSJames Collins                tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' .
10279cff245bSJames Collins                $html . '</div></aside>';
1028ab45ba71SJames Collins        }
1029ab45ba71SJames Collins
10309cff245bSJames Collins        if ($parse === true) {
10319cff245bSJames Collins            $html = $this->includeIcons($html);
10323a04a100SJames Collins        }
10339cff245bSJames Collins        if ($print === true) {
10349cff245bSJames Collins            echo $html;
1035ab45ba71SJames Collins        }
10364f8225e4SJames Collins
1037ab45ba71SJames Collins        return $html;
1038ab45ba71SJames Collins    }
1039ab45ba71SJames Collins
1040ab45ba71SJames Collins
1041a8eebd82SJames Collins    /**
1042ab45ba71SJames Collins     * Print or return the page tools content
1043ab45ba71SJames Collins     *
10449cff245bSJames Collins     * @param   boolean $print     Print the generated content to the output buffer.
10459cff245bSJames Collins     * @param   boolean $includeId Include the dw__pagetools id in the element.
1046ab45ba71SJames Collins     * @return  string             generated content
1047ab45ba71SJames Collins     */
10489cff245bSJames Collins    public function includePageTools(bool $print = true, bool $includeId = false)
104910b40067Snomadjimbob    {
10501293ce10SJames Collins        global $USERINFO;
10511293ce10SJames Collins
10529cff245bSJames Collins        $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0);
1053ab45ba71SJames Collins        $html = '';
1054ab45ba71SJames Collins
10559cff245bSJames Collins        $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
1056b9c0582bSJames Collins        $html .= '<ul class="tools">';
1057ab45ba71SJames Collins
1058ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
1059ab45ba71SJames Collins        foreach ($items as $item) {
10609cff245bSJames Collins            $classes = [];
10613fd763a0SJames Collins            $classes[] = $item->getType();
10623fd763a0SJames Collins            $attr = $item->getLinkAttributes();
10633fd763a0SJames Collins
10649cff245bSJames Collins            if (empty($attr['class']) === false) {
10653fd763a0SJames Collins                $classes = array_merge($classes, explode(' ', $attr['class']));
1066ab45ba71SJames Collins            }
1067ab45ba71SJames Collins
10683fd763a0SJames Collins            $classes = array_unique($classes);
1069*fd16ea41SJames Collins            $title = isset($attr['title']) && $attr['title'] !== 0 ? $attr['title'] : $item->getTitle();
10703fd763a0SJames Collins
1071f02b8ab5SJames Collins            $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()), 'always');
10729cff245bSJames Collins            if (
10733a385f2cSJames Collins                $showItem !== false && (strcasecmp($showItem, 'always') === 0 ||
10743a385f2cSJames Collins                (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) ||
10753a385f2cSJames Collins                (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true))
10769cff245bSJames Collins            ) {
10773fd763a0SJames Collins                $html .= '<li class="' . implode(' ', $classes) . '">';
10789cff245bSJames Collins                $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' .
1079*fd16ea41SJames Collins                    $title . '"' . (isset($attr['accesskey']) && $attr['accesskey'] !== '' ? ' accesskey="' . $attr['accesskey'] . '"' : '') . '><div class="icon">' . inlineSVG($item->getSvg()) .
10809cff245bSJames Collins                    '</div><span class="a11y">' . $item->getLabel() . '</span></a>';
10813fd763a0SJames Collins                $html .= '</li>';
10823fd763a0SJames Collins            }
10839cff245bSJames Collins        }//end foreach
10843fd763a0SJames Collins
10853fd763a0SJames Collins        $html .= '</ul>';
1086ab45ba71SJames Collins        $html .= '</nav>';
1087ab45ba71SJames Collins
10889cff245bSJames Collins        if ($print === true) {
10899cff245bSJames Collins            echo $html;
10909cff245bSJames Collins        }
1091ab45ba71SJames Collins        return $html;
1092ab45ba71SJames Collins    }
1093ab45ba71SJames Collins
1094ab45ba71SJames Collins
1095a8eebd82SJames Collins    /**
1096a8eebd82SJames Collins     * Print or return the search bar
1097a8eebd82SJames Collins     *
10989cff245bSJames Collins     * @param   boolean $print Print content.
1099a8eebd82SJames Collins     * @return  string         contents of the search bar
1100a8eebd82SJames Collins     */
11019cff245bSJames Collins    public function includeSearch(bool $print = true)
110210b40067Snomadjimbob    {
11039cff245bSJames Collins        global $lang, $ID, $ACT, $QUERY;
1104ab45ba71SJames Collins        $html = '';
1105ab45ba71SJames Collins
11069cff245bSJames Collins        $html .= '<form class="mikio-search search" action="' . wl() .
11079cff245bSJames Collins            '" accept-charset="utf-8" method="get" role="search">';
1108a8eebd82SJames Collins        $html .= '<input type="hidden" name="do" value="search">';
1109a8eebd82SJames Collins        $html .= '<input type="hidden" name="id" value="' . $ID . '">';
1110c1cb9f15SChris MacMackin        $html .= '<input name="q" ';
11119cff245bSJames Collins        if ($this->getConf('searchUseTypeahead') === true) {
1112c1cb9f15SChris MacMackin            $html .= 'class="search_typeahead" ';
1113c1cb9f15SChris MacMackin        }
11149cff245bSJames Collins        $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' .
11153a385f2cSJames Collins            ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
1116a8eebd82SJames Collins        $html .= '<button type="submit" title="' .  $lang['btn_search'] . '">';
11173a385f2cSJames Collins        if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) {
1118a8eebd82SJames Collins            $html .= $this->mikioInlineIcon('search');
1119ab45ba71SJames Collins        } else {
1120ab45ba71SJames Collins            $html .= $lang['btn_search'];
1121ab45ba71SJames Collins        }
1122ab45ba71SJames Collins        $html .= '</button>';
1123ab45ba71SJames Collins        $html .= '</form>';
1124ab45ba71SJames Collins
11259cff245bSJames Collins        if ($print === true) {
11269cff245bSJames Collins            echo $html;
11279cff245bSJames Collins        }
1128ab45ba71SJames Collins        return $html;
1129ab45ba71SJames Collins    }
1130ab45ba71SJames Collins
1131ab45ba71SJames Collins
1132a8eebd82SJames Collins    /**
1133a8eebd82SJames Collins     * Print or return content
1134a8eebd82SJames Collins     *
11359cff245bSJames Collins     * @param   boolean $print Print content.
1136a8eebd82SJames Collins     * @return  string         contents
1137a8eebd82SJames Collins     */
11389cff245bSJames Collins    public function includeContent(bool $print = true)
113910b40067Snomadjimbob    {
1140ab45ba71SJames Collins        ob_start();
11419cff245bSJames Collins        tpl_content(false);
1142ab45ba71SJames Collins        $html = ob_get_contents();
1143ab45ba71SJames Collins        ob_end_clean();
1144ab45ba71SJames Collins
1145ab45ba71SJames Collins        $html = $this->includeIcons($html);
1146ab45ba71SJames Collins        $html = $this->parseContent($html);
1147ab45ba71SJames Collins
1148ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
1149ab45ba71SJames Collins
11509cff245bSJames Collins        if ($this->getConf('heroTitle') === false) {
11519cff245bSJames Collins            $html = '<div class="mikio-tags"></div>' . $html;
11529cff245bSJames Collins        }
1153a8eebd82SJames Collins
1154a8eebd82SJames Collins        $html = '<div class="mikio-article-content">' . $html . '</div>';
1155a8eebd82SJames Collins
11569cff245bSJames Collins        if ($print === true) {
11579cff245bSJames Collins            echo $html;
11589cff245bSJames Collins        }
1159ab45ba71SJames Collins        return $html;
1160ab45ba71SJames Collins    }
1161ab45ba71SJames Collins
1162daf2cd7aSJames Collins    private function custom_tpl_pageinfo($ret = false)
1163daf2cd7aSJames Collins    {
1164daf2cd7aSJames Collins        global $conf;
1165daf2cd7aSJames Collins        global $lang;
1166daf2cd7aSJames Collins        global $INFO;
1167daf2cd7aSJames Collins        global $ID;
1168daf2cd7aSJames Collins
1169daf2cd7aSJames Collins        // return if we are not allowed to view the page
1170daf2cd7aSJames Collins        if (!auth_quickaclcheck($ID)) {
1171daf2cd7aSJames Collins            return false;
1172daf2cd7aSJames Collins        }
1173daf2cd7aSJames Collins
1174daf2cd7aSJames Collins        if ($INFO['exists']) {
1175daf2cd7aSJames Collins            $file = $INFO['filepath'];
1176daf2cd7aSJames Collins            if (!$conf['fullpath']) {
1177daf2cd7aSJames Collins                if ($INFO['rev']) {
1178daf2cd7aSJames Collins                    $file = str_replace($conf['olddir'] . '/', '', $file);
1179daf2cd7aSJames Collins                } else {
1180daf2cd7aSJames Collins                    $file = str_replace($conf['datadir'] . '/', '', $file);
1181daf2cd7aSJames Collins                }
1182daf2cd7aSJames Collins            }
1183daf2cd7aSJames Collins            $file = utf8_decodeFN($file);
1184daf2cd7aSJames Collins            $date = dformat($INFO['lastmod']);
1185daf2cd7aSJames Collins
1186daf2cd7aSJames Collins            $string = $this->getConf('footerPageInfoText', '');
1187daf2cd7aSJames Collins
1188daf2cd7aSJames Collins            // replace lang items
1189daf2cd7aSJames Collins            $string = preg_replace_callback('/%([^%]+)%/', function ($matches) use ($lang) {
1190daf2cd7aSJames Collins                return isset($lang[$matches[1]]) ? $lang[$matches[1]] : '';
1191daf2cd7aSJames Collins            }, $string);
1192daf2cd7aSJames Collins
1193daf2cd7aSJames Collins            $options = [
1194daf2cd7aSJames Collins                'file' => '<bdi>' . $file . '</bdi>',
1195daf2cd7aSJames Collins                'date' => $date,
1196daf2cd7aSJames Collins                'user' => $INFO['editor'] ? '<bdi>' . editorinfo($INFO['editor']) . '</bdi>' : $lang['external_edit']
1197daf2cd7aSJames Collins            ];
1198daf2cd7aSJames Collins
1199daf2cd7aSJames Collins            if (!empty($_SERVER['REMOTE_USER'])) {
1200daf2cd7aSJames Collins                $options['loggedin'] = true;
1201daf2cd7aSJames Collins            }
1202daf2cd7aSJames Collins
1203daf2cd7aSJames Collins            if ($INFO['locked']) {
1204daf2cd7aSJames Collins                $options['locked'] = '<bdi>' . editorinfo($INFO['locked']) . '</bdi>';
1205daf2cd7aSJames Collins            }
1206daf2cd7aSJames Collins
1207daf2cd7aSJames Collins            $parser = new \ParensParser();
1208daf2cd7aSJames Collins            $result = $parser->parse($string);
1209daf2cd7aSJames Collins
1210daf2cd7aSJames Collins            $parserIterate = function ($arr, $func) use ($options) {
1211daf2cd7aSJames Collins                $str = '';
1212daf2cd7aSJames Collins
1213daf2cd7aSJames Collins                foreach ($arr as $value) {
1214daf2cd7aSJames Collins                    if (is_array($value)) {
1215daf2cd7aSJames Collins                        $str .= $func($value, $func);
1216daf2cd7aSJames Collins                    } else {
1217daf2cd7aSJames Collins                        if (preg_match('/^([a-zA-Z]+)=(.*)/', $value, $matches)) {
1218daf2cd7aSJames Collins                            $key = strtolower($matches[1]); // Extract the key (a-zA-Z part)
1219daf2cd7aSJames Collins
1220daf2cd7aSJames Collins                            if (isset($options[$key])) {
1221daf2cd7aSJames Collins                                $str .= $matches[2];
1222daf2cd7aSJames Collins                            } else {
1223daf2cd7aSJames Collins                                return $str;
1224daf2cd7aSJames Collins                            }
1225daf2cd7aSJames Collins                        } else {
1226daf2cd7aSJames Collins                            $str .= $value;
1227daf2cd7aSJames Collins                        }
1228daf2cd7aSJames Collins                    }
1229daf2cd7aSJames Collins                }//end foreach
1230daf2cd7aSJames Collins
1231daf2cd7aSJames Collins                return $str;
1232daf2cd7aSJames Collins            };
1233daf2cd7aSJames Collins
1234daf2cd7aSJames Collins            $string = $parserIterate($result, $parserIterate);
1235daf2cd7aSJames Collins
1236daf2cd7aSJames Collins            $string = preg_replace_callback('/{([^}]+)}/', function ($matches) use ($options) {
1237daf2cd7aSJames Collins                $key = strtolower($matches[1]);
1238daf2cd7aSJames Collins                return isset($options[$key]) ? $options[$key] : '';
1239daf2cd7aSJames Collins            }, $string);
1240daf2cd7aSJames Collins
1241daf2cd7aSJames Collins            if ($ret) {
1242daf2cd7aSJames Collins                return $string;
1243daf2cd7aSJames Collins            } else {
1244daf2cd7aSJames Collins                echo $string;
1245daf2cd7aSJames Collins                return true;
1246daf2cd7aSJames Collins            }
1247daf2cd7aSJames Collins        }//end if
1248daf2cd7aSJames Collins
1249daf2cd7aSJames Collins        return false;
1250daf2cd7aSJames Collins    }
1251daf2cd7aSJames Collins
1252a8eebd82SJames Collins    /**
1253ab45ba71SJames Collins     * Print or return footer
1254ab45ba71SJames Collins     *
12559cff245bSJames Collins     * @param   boolean $print Print footer.
12569cff245bSJames Collins     * @return  string         HTML string containing footer
1257ab45ba71SJames Collins     */
12589cff245bSJames Collins    public function includeFooter(bool $print = true)
125910b40067Snomadjimbob    {
1260ab45ba71SJames Collins        global $ACT;
1261ab45ba71SJames Collins
1262ab45ba71SJames Collins        $html = '';
1263ab45ba71SJames Collins
1264ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
1265daf2cd7aSJames Collins        $html .= '<div class="doc">' . $this->custom_tpl_pageinfo(true) . '</div>';
12669cff245bSJames Collins        $html .= $this->includePage('footer', false);
1267ab45ba71SJames Collins
1268a8eebd82SJames Collins        $html .= $this->stringToNav($this->getConf('footerCustomMenuText'));
1269ab45ba71SJames Collins
12709cff245bSJames Collins        if ($this->getConf('footerSearch') === true) {
1271ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
12729cff245bSJames Collins            $html .= $this->includeSearch(false);
1273ab45ba71SJames Collins            $html .= '</div>';
1274ab45ba71SJames Collins        }
1275ab45ba71SJames Collins
1276a8eebd82SJames Collins        $showPageTools = $this->getConf('pageToolsFooter');
12779cff245bSJames Collins        if (
12783a385f2cSJames Collins            strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 ||
12793a385f2cSJames Collins            $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0)
12809cff245bSJames Collins        ) {
12819cff245bSJames Collins            $html .= $this->includePageTools(false);
12829cff245bSJames Collins        }
1283ab45ba71SJames Collins
12849cff245bSJames Collins        $meta['licenseType']            = ['multichoice', '_choices' => ['none', 'badge', 'button']];
12859cff245bSJames Collins        $meta['licenseImageOnly']       = ['onoff'];
1286ab45ba71SJames Collins
1287ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
12889cff245bSJames Collins        if ($licenseType !== 'none') {
12899cff245bSJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true);
1290ab45ba71SJames Collins        }
1291ab45ba71SJames Collins
1292ab45ba71SJames Collins        $html .= '</footer>';
1293ab45ba71SJames Collins
12949cff245bSJames Collins        if ($print === true) {
12959cff245bSJames Collins            echo $html;
12969cff245bSJames Collins        }
1297ab45ba71SJames Collins        return $html;
1298ab45ba71SJames Collins    }
1299ab45ba71SJames Collins
1300ab45ba71SJames Collins
1301a8eebd82SJames Collins    /**
1302ab45ba71SJames Collins     * Print or return breadcrumb trail
1303ab45ba71SJames Collins     *
13049cff245bSJames Collins     * @param   boolean $print Print out trail.
13059cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
13069cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
1307ab45ba71SJames Collins     */
13089cff245bSJames Collins    public function includeBreadcrumbs(bool $print = true, bool $parse = true)
130910b40067Snomadjimbob    {
1310a8eebd82SJames Collins        global $conf, $ID, $lang, $ACT;
1311a8eebd82SJames Collins
13123a385f2cSJames Collins        if (
13133a385f2cSJames Collins            $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 &&
131495372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0
13153a385f2cSJames Collins        ) {
13169cff245bSJames Collins            return '';
13179cff245bSJames Collins        }
1318ab45ba71SJames Collins
1319ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
1320f8039bf2SJames Collins        $html .= '<div class="mikio-container">';
13213a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
132295372bffSJames Collins            if ($conf['breadcrumbs'] !== 0) {
13239cff245bSJames Collins                if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) {
1324ab45ba71SJames Collins                    ob_start();
132575adba86SJames Collins                    tpl_breadcrumbs();
1326ab45ba71SJames Collins                    $html .= ob_get_contents();
1327ab45ba71SJames Collins                    ob_end_clean();
1328ab45ba71SJames Collins                } else {
1329ab45ba71SJames Collins                    $sep = '•';
1330ab45ba71SJames Collins                    $prefix = $lang['breadcrumb'];
1331ab45ba71SJames Collins
13329cff245bSJames Collins                    if ($this->getConf('breadcrumbSep') === true) {
1333ab45ba71SJames Collins                        $sep = $this->getConf('breadcrumbSepText');
13349cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-sep', false);
1335ab45ba71SJames Collins
13369cff245bSJames Collins                        if ($img !== false) {
1337ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1338ab45ba71SJames Collins                        }
133947161538SJames Collins                    }
134047161538SJames Collins
13419cff245bSJames Collins                    if ($this->getConf('breadcrumbPrefix') === true) {
1342ab45ba71SJames Collins                        $prefix = $this->getConf('breadcrumbPrefixText');
13439cff245bSJames Collins                        $img = $this->getMediaFile('breadcrumb-prefix', false);
1344ab45ba71SJames Collins
13459cff245bSJames Collins                        if ($img !== false) {
1346ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
1347ab45ba71SJames Collins                        }
1348ab45ba71SJames Collins                    }
1349ab45ba71SJames Collins
1350ab45ba71SJames Collins                    $crumbs = breadcrumbs();
1351ab45ba71SJames Collins
1352ab45ba71SJames Collins                    $html .= '<ul>';
13533a385f2cSJames Collins                    if (empty($prefix) === false) {
13549cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
13559cff245bSJames Collins                    }
1356ab45ba71SJames Collins
1357ab45ba71SJames Collins                    $last = count($crumbs);
1358ab45ba71SJames Collins                    $i    = 0;
1359ab45ba71SJames Collins                    foreach ($crumbs as $id => $name) {
1360ab45ba71SJames Collins                        $i++;
136195372bffSJames Collins                        if ($i !== 1) {
1362ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
136395372bffSJames Collins                        }
13649cff245bSJames Collins                        $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>';
13659cff245bSJames Collins                        $html .= tpl_pagelink($id, null, true);
1366ab45ba71SJames Collins                        $html .= '</li>';
1367ab45ba71SJames Collins                    }
1368ab45ba71SJames Collins
1369ab45ba71SJames Collins                    $html .= '</ul>';
13709cff245bSJames Collins                }//end if
13719cff245bSJames Collins            }//end if
13729cff245bSJames Collins        }//end if
13733d11a778SJames Collins
13743d11a778SJames Collins        $html .= '</div>';
13753d11a778SJames Collins        $html .= '</div>';
13763d11a778SJames Collins
13779cff245bSJames Collins        if ($parse === true) {
13789cff245bSJames Collins            $html = $this->includeIcons($html);
13799cff245bSJames Collins        }
13809cff245bSJames Collins        if ($print === true) {
13819cff245bSJames Collins            echo $html;
13829cff245bSJames Collins        }
13833d11a778SJames Collins        return $html;
13843d11a778SJames Collins    }
13853d11a778SJames Collins
13863d11a778SJames Collins    /**
13873d11a778SJames Collins     * Print or return you are here trail
13883d11a778SJames Collins     *
13899cff245bSJames Collins     * @param   boolean $print Print out trail.
13909cff245bSJames Collins     * @param   boolean $parse Parse trail before printing.
13919cff245bSJames Collins     * @return  string         HTML string containing breadcrumbs
13923d11a778SJames Collins     */
13939cff245bSJames Collins    public function includeYouAreHere(bool $print = true, bool $parse = true)
13943d11a778SJames Collins    {
13953d11a778SJames Collins        global $conf, $ID, $lang, $ACT;
13963d11a778SJames Collins
13973a385f2cSJames Collins        if (
13983a385f2cSJames Collins            $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 &&
139995372bffSJames Collins            strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0
14003a385f2cSJames Collins        ) {
14019cff245bSJames Collins            return '';
14029cff245bSJames Collins        }
14033d11a778SJames Collins
14043d11a778SJames Collins        $html = '<div class="mikio-youarehere">';
14053d11a778SJames Collins        $html .= '<div class="mikio-container">';
14063a385f2cSJames Collins        if (strcasecmp($ACT, 'show') === 0) {
140795372bffSJames Collins            if ($conf['youarehere'] !== 0) {
14089cff245bSJames Collins                if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) {
140995372bffSJames Collins                    $html .= '<div class="mikio-bcdw">';
1410ab45ba71SJames Collins                    ob_start();
141175adba86SJames Collins                    tpl_youarehere();
1412ab45ba71SJames Collins                    $html .= ob_get_contents();
1413ab45ba71SJames Collins                    ob_end_clean();
141495372bffSJames Collins                    $html .= '</div>';
1415ab45ba71SJames Collins                } else {
1416ab45ba71SJames Collins                    $sep = ' » ';
1417ab45ba71SJames Collins                    $prefix = $lang['youarehere'];
1418ab45ba71SJames Collins
14199cff245bSJames Collins                    if ($this->getConf('youarehereSep') === true) {
14203d11a778SJames Collins                        $sep = $this->getConf('youarehereSepText');
14219cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-sep', false);
1422ab45ba71SJames Collins
14239cff245bSJames Collins                        if ($img !== false) {
1424ab45ba71SJames Collins                            $sep = '<img src="' . $img . '">';
1425ab45ba71SJames Collins                        }
142675adba86SJames Collins                    }
142775adba86SJames Collins
14289cff245bSJames Collins                    if ($this->getConf('youareherePrefix') === true) {
14293d11a778SJames Collins                        $prefix = $this->getConf('youareherePrefixText');
14309cff245bSJames Collins                        $img = $this->getMediaFile('youarehere-prefix', false);
1431ab45ba71SJames Collins
14329cff245bSJames Collins                        if ($img !== false) {
1433ab45ba71SJames Collins                            $prefix = '<img src="' . $img . '">';
143475adba86SJames Collins                        }
143547161538SJames Collins                    }
143647161538SJames Collins
1437ab45ba71SJames Collins                    $html .= '<ul>';
14383a385f2cSJames Collins                    if (empty($prefix) === false) {
14399cff245bSJames Collins                        $html .= '<li class="prefix">' . $prefix . '</li>';
14409cff245bSJames Collins                    }
14419cff245bSJames Collins                    $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>';
1442ab45ba71SJames Collins
1443ab45ba71SJames Collins                    $parts = explode(':', $ID);
1444ab45ba71SJames Collins                    $count = count($parts);
1445ab45ba71SJames Collins
1446ab45ba71SJames Collins                    $part = '';
14479cff245bSJames Collins                    for ($i = 0; $i < ($count - 1); $i++) {
1448ab45ba71SJames Collins                        $part .= $parts[$i] . ':';
1449ab45ba71SJames Collins                        $page = $part;
14509cff245bSJames Collins                        if ($page === $conf['start']) {
14519cff245bSJames Collins                            continue;
14529cff245bSJames Collins                        }
1453ab45ba71SJames Collins
1454ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
14559cff245bSJames Collins                        $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1456ab45ba71SJames Collins                    }
1457ab45ba71SJames Collins
1458*fd16ea41SJames Collins                    $exists = false;
1459ab45ba71SJames Collins                    resolve_pageid('', $page, $exists);
14609cff245bSJames Collins                    if ((isset($page) === true && $page === $part . $parts[$i]) === false) {
1461ab45ba71SJames Collins                        $page = $part . $parts[$i];
14629cff245bSJames Collins                        if ($page !== $conf['start']) {
1463ab45ba71SJames Collins                            $html .= '<li class="sep">' . $sep . '</li>';
14649cff245bSJames Collins                            $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>';
1465ab45ba71SJames Collins                        }
1466ab45ba71SJames Collins                    }
1467ab45ba71SJames Collins
1468ab45ba71SJames Collins                    $html .= '</ul>';
14699cff245bSJames Collins                }//end if
14709cff245bSJames Collins            }//end if
1471ab45ba71SJames Collins
14723d11a778SJames Collins            $showLast = $this->getConf('youarehereShowLast');
14739cff245bSJames Collins            if ($showLast !== 0) {
1474a8eebd82SJames Collins                preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches);
14759cff245bSJames Collins                if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) {
1476a8eebd82SJames Collins                    $count = count($matches[0]);
1477a8eebd82SJames Collins                    $list = '';
1478a8eebd82SJames Collins
1479a8eebd82SJames Collins                    // Show Home
1480a8eebd82SJames Collins                    $list .= $matches[0][0] . $matches[0][1];
1481a8eebd82SJames Collins
1482a8eebd82SJames Collins                    $list .= '<li>...</li>';
14839cff245bSJames Collins                    for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) {
1484a8eebd82SJames Collins                        $list .= $matches[0][$i];
1485a8eebd82SJames Collins                    }
1486a8eebd82SJames Collins
1487a8eebd82SJames Collins                    $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html);
1488a8eebd82SJames Collins                }
1489a8eebd82SJames Collins            }
1490a8eebd82SJames Collins
14913d11a778SJames Collins            switch ($this->getConf('youarehereHome')) {
1492a8eebd82SJames Collins                case 'none':
1493a8eebd82SJames Collins                    $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2);
1494a8eebd82SJames Collins                    break;
1495a8eebd82SJames Collins                case 'home':
1496a8eebd82SJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1);
1497a8eebd82SJames Collins                    break;
1498a8eebd82SJames Collins                case 'icon':
14999cff245bSJames Collins                    $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' .
15009cff245bSJames Collins                        $this->mikioInlineIcon('home') . '$3', $html, 1);
1501a8eebd82SJames Collins                    break;
1502a8eebd82SJames Collins            }
1503a8eebd82SJames Collins        } else {
1504a8eebd82SJames Collins            $html .= '&#8810; ';
15059cff245bSJames Collins            if (isset($_GET['page']) === true) {
15069cff245bSJames Collins                $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a>&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
1507a8eebd82SJames Collins            }
15084057121fSJames Collins            $html .= '<a href="' . wl($ID) . '">View Page</a>';
15099cff245bSJames Collins        }//end if
15109cff245bSJames Collins
15119cff245bSJames Collins        $html .= '</div>';
15129cff245bSJames Collins        $html .= '</div>';
15139cff245bSJames Collins
15149cff245bSJames Collins        if ($parse === true) {
15159cff245bSJames Collins            $html = $this->includeIcons($html);
1516a8eebd82SJames Collins        }
15179cff245bSJames Collins        if ($print === true) {
15189cff245bSJames Collins            echo $html;
15199cff245bSJames Collins        }
1520ab45ba71SJames Collins        return $html;
1521ab45ba71SJames Collins    }
1522ab45ba71SJames Collins
15231785fc73SJames Collins    /**
15241785fc73SJames Collins     * Get Page Title
15259cff245bSJames Collins     *
15269cff245bSJames Collins     * @return string page title
15271785fc73SJames Collins     */
152810b40067Snomadjimbob    public function parsePageTitle()
152910b40067Snomadjimbob    {
15302060e56cSJames Collins        global $ID;
15312060e56cSJames Collins
15322060e56cSJames Collins        $title = p_get_first_heading($ID);
15339cff245bSJames Collins        if (strlen($title) <= 0) {
15349cff245bSJames Collins            $title = tpl_pagetitle(null, true);
15359cff245bSJames Collins        }
15361785fc73SJames Collins        $title = $this->includeIcons($title);
15371785fc73SJames Collins
15381785fc73SJames Collins        return $title;
15391785fc73SJames Collins    }
15401785fc73SJames Collins
1541ab45ba71SJames Collins
154275adba86SJames Collins    /**
1543a8eebd82SJames Collins     * Print or return hero block
154475adba86SJames Collins     *
15459cff245bSJames Collins     * @param   boolean $print Print content.
1546a8eebd82SJames Collins     * @return  string         contents of hero
154775adba86SJames Collins     */
15489cff245bSJames Collins    public function includeHero(bool $print = true)
154910b40067Snomadjimbob    {
1550a8eebd82SJames Collins        $html = '';
155147161538SJames Collins
15529cff245bSJames Collins        if ($this->getConf('heroTitle') === true) {
1553a8eebd82SJames Collins            $html .= '<div class="mikio-hero">';
1554f8039bf2SJames Collins            $html .= '<div class="mikio-container">';
1555a8eebd82SJames Collins            $html .= '<div class="mikio-hero-text">';
15563a385f2cSJames Collins            if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) {
15579cff245bSJames Collins                $html .= $this->includeYouAreHere(false);
15589cff245bSJames Collins            }
15593a385f2cSJames Collins            if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) {
15609cff245bSJames Collins                $html .= $this->includeBreadcrumbs(false);
15619cff245bSJames Collins            }
1562ab45ba71SJames Collins
1563a8eebd82SJames Collins            $html .= '<h1 class="mikio-hero-title">';
15641785fc73SJames Collins            $html .= $this->parsePageTitle();    // No idea why this requires a blank space afterwards to work?
1565a8eebd82SJames Collins            $html .= '</h1>';
1566a8eebd82SJames Collins            $html .= '<h2 class="mikio-hero-subtitle"></h2>';
1567a8eebd82SJames Collins            $html .= '</div>';
156847161538SJames Collins
15699cff245bSJames Collins            $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true));
1570a8eebd82SJames Collins            $hero_image_resize_class = '';
15713a385f2cSJames Collins            if (empty($hero_image) === false) {
1572a8eebd82SJames Collins                $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"';
1573a8eebd82SJames Collins                $hero_image_resize_class = ' mikio-hero-image-resize';
157447161538SJames Collins            }
1575a8eebd82SJames Collins
15769cff245bSJames Collins            $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image .
15779cff245bSJames Collins                '><div class="mikio-tags"></div></div>';
1578a8eebd82SJames Collins
1579a8eebd82SJames Collins            $html .= '</div>';
1580f8039bf2SJames Collins            $html .= '</div>';
15819cff245bSJames Collins        }//end if
15829cff245bSJames Collins
15839cff245bSJames Collins        if ($print === true) {
15849cff245bSJames Collins            echo $html;
158575adba86SJames Collins        }
1586a8eebd82SJames Collins
1587a8eebd82SJames Collins        return $html;
158875adba86SJames Collins    }
158975adba86SJames Collins
159075adba86SJames Collins
159175adba86SJames Collins    /**
1592a8eebd82SJames Collins     * Print or return out TOC
159375adba86SJames Collins     *
15949cff245bSJames Collins     * @param   boolean $print Print TOC.
15959cff245bSJames Collins     * @param   boolean $parse Parse icons.
1596a8eebd82SJames Collins     * @return  string         contents of TOC
159775adba86SJames Collins     */
15989cff245bSJames Collins    public function includeTOC(bool $print = true, bool $parse = true)
159910b40067Snomadjimbob    {
1600ab45ba71SJames Collins        $html = '';
16012b4583abSJames Collins
1602ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
1603ab45ba71SJames Collins
16043a385f2cSJames Collins        if (empty($tocHtml) === false) {
1605f65a4e5eSJames Collins            $tocHtml = preg_replace(
1606f65a4e5eSJames Collins                '/(<h3.+?toggle.+?>)(.+?)<\/h3>/',
1607f65a4e5eSJames Collins                '$1' .
1608f65a4e5eSJames Collins                $this->mikioInlineIcon('hamburger', 'hamburger') . '$2' .
1609f65a4e5eSJames Collins                $this->mikioInlineIcon('down-arrow', 'down-arrow') . '</h3>',
1610f65a4e5eSJames Collins                $tocHtml
1611f65a4e5eSJames Collins            );
1612ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
1613a8eebd82SJames Collins            $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml);
1614ab45ba71SJames Collins
1615ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
1616ab45ba71SJames Collins            $html .= $tocHtml;
1617ab45ba71SJames Collins            $html .= '</div>';
16182b4583abSJames Collins        }
16192b4583abSJames Collins
16209cff245bSJames Collins        if ($parse === true) {
16219cff245bSJames Collins            $html = $this->includeIcons($html);
16229cff245bSJames Collins        }
16239cff245bSJames Collins
16249cff245bSJames Collins        if ($print === true) {
1625ab45ba71SJames Collins            echo $html;
1626ab45ba71SJames Collins        }
1627ab45ba71SJames Collins
16289cff245bSJames Collins        return $html;
16299cff245bSJames Collins    }
16309cff245bSJames Collins
1631ab45ba71SJames Collins
1632a8eebd82SJames Collins    /**
1633ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
1634ab45ba71SJames Collins     *
16359cff245bSJames Collins     * @param   string $str Content to parse.
1636ab45ba71SJames Collins     * @return  string      parsed string
1637ab45ba71SJames Collins     */
16389cff245bSJames Collins    public function includeIcons(string $str)
163910b40067Snomadjimbob    {
1640ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
1641ab45ba71SJames Collins
1642ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
16433a385f2cSJames Collins        if (empty($iconTag) === true) {
16449cff245bSJames Collins            return $str;
16459cff245bSJames Collins        }
1646ab45ba71SJames Collins
16479cff245bSJames Collins        if (
16489cff245bSJames Collins            in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true ||
16493a385f2cSJames Collins            strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0
16509cff245bSJames Collins        ) {
1651a2005a27SJames Collins            $content = $str;
1652a2005a27SJames Collins            $preview = null;
1653a2005a27SJames Collins
16543a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
16559cff245bSJames Collins                $html = new \simple_html_dom();
1656a2005a27SJames Collins                $html->stripRNAttrValues = false;
1657a2005a27SJames Collins                $html->load($str, true, false);
1658a2005a27SJames Collins
1659a2005a27SJames Collins                $preview = $html->find('div.preview');
16609cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1661a2005a27SJames Collins                    $content = $preview[0]->innertext;
1662a2005a27SJames Collins                }
1663a2005a27SJames Collins            }
1664a2005a27SJames Collins
16651785fc73SJames Collins            $page_regex = '/(.*)/';
16669cff245bSJames Collins            if (stripos($str, '<pre') !== false) {
16671785fc73SJames Collins                $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/';
16681785fc73SJames Collins            }
16691785fc73SJames Collins
16701785fc73SJames Collins            $content = preg_replace_callback($page_regex, function ($icons) {
1671a2005a27SJames Collins                $iconTag = $this->getConf('iconTag', 'icon');
1672a2005a27SJames Collins
167310b40067Snomadjimbob                return preg_replace_callback(
167410b40067Snomadjimbob                    '/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
1675ab45ba71SJames Collins                    function ($matches) {
1676ab45ba71SJames Collins                        global $MIKIO_ICONS;
1677ab45ba71SJames Collins
1678ab45ba71SJames Collins                        $s = $matches[0];
1679ab45ba71SJames Collins
1680ab45ba71SJames Collins                        if (count($MIKIO_ICONS) > 0) {
1681ab45ba71SJames Collins                            $icon = $MIKIO_ICONS[0];
1682ab45ba71SJames Collins
1683ab45ba71SJames Collins                            if (count($matches) > 1) {
1684ab45ba71SJames Collins                                $e = explode(' ', $matches[1]);
1685ab45ba71SJames Collins
1686ab45ba71SJames Collins                                if (count($e) > 1) {
1687ab45ba71SJames Collins                                    foreach ($MIKIO_ICONS as $iconItem) {
16889cff245bSJames Collins                                        if (strcasecmp($iconItem['name'], $e[0]) === 0) {
1689ab45ba71SJames Collins                                            $icon = $iconItem;
1690ab45ba71SJames Collins
1691ab45ba71SJames Collins                                            $s = $icon['insert'];
1692ab45ba71SJames Collins                                            for ($i = 1; $i < 9; $i++) {
16931cdedf28SJames Collins                                                if (count($e) < $i || empty($e[$i]) === true) {
16949cff245bSJames Collins                                                    if (isset($icon['$' . $i]) === true) {
1695ab45ba71SJames Collins                                                        $s = str_replace('$' . $i, $icon['$' . $i], $s);
1696ab45ba71SJames Collins                                                    }
1697ab45ba71SJames Collins                                                } else {
1698ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $e[$i], $s);
1699ab45ba71SJames Collins                                                }
1700ab45ba71SJames Collins                                            }
1701ab45ba71SJames Collins
1702ab45ba71SJames Collins                                            $dir = '';
17039cff245bSJames Collins                                            if (isset($icon['dir']) === true) {
17049cff245bSJames Collins                                                $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
17059cff245bSJames Collins                                            }
1706ab45ba71SJames Collins
1707ab45ba71SJames Collins                                            $s = str_replace('$0', $dir, $s);
1708ab45ba71SJames Collins
1709ab45ba71SJames Collins                                            break;
17109cff245bSJames Collins                                        }//end if
17119cff245bSJames Collins                                    }//end foreach
1712ab45ba71SJames Collins                                } else {
1713ab45ba71SJames Collins                                    $s = str_replace('$1', $matches[1], $icon['insert']);
17149cff245bSJames Collins                                }//end if
17159cff245bSJames Collins                            }//end if
17169cff245bSJames Collins                        }//end if
171775adba86SJames Collins
1718ab45ba71SJames Collins                        $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
17199cff245bSJames Collins                        if ($count === 0) {
1720ab45ba71SJames Collins                            $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
1721ab45ba71SJames Collins                        }
1722ab45ba71SJames Collins
1723ab45ba71SJames Collins                        return $s;
1724ab45ba71SJames Collins                    },
172510b40067Snomadjimbob                    $icons[0]
172610b40067Snomadjimbob                );
1727a2005a27SJames Collins            }, $content);
1728a2005a27SJames Collins
17293a385f2cSJames Collins            if (strcasecmp($ACT, 'preview') === 0) {
17309cff245bSJames Collins                if (is_array($preview) === true && count($preview) > 0) {
1731a2005a27SJames Collins                    $preview[0]->innertext = $content;
1732a2005a27SJames Collins                }
1733a2005a27SJames Collins
1734a2005a27SJames Collins                $str = $html->save();
1735a2005a27SJames Collins                $html->clear();
1736a2005a27SJames Collins                unset($html);
1737a2005a27SJames Collins            } else {
1738a2005a27SJames Collins                $str = $content;
1739a2005a27SJames Collins            }
17409cff245bSJames Collins        }//end if
1741ab45ba71SJames Collins
1742ab45ba71SJames Collins        return $str;
1743ab45ba71SJames Collins    }
174447161538SJames Collins
1745c165b184SJames Collins    /**
1746a8eebd82SJames Collins     * Parse HTML for theme
1747c165b184SJames Collins     *
17489cff245bSJames Collins     * @param   string $content HTML content to parse.
1749a8eebd82SJames Collins     * @return  string          Parsed content
1750c165b184SJames Collins     */
17519cff245bSJames Collins    public function parseContent(string $content)
175210b40067Snomadjimbob    {
1753ab45ba71SJames Collins        global $INPUT, $ACT;
1754ab45ba71SJames Collins
1755a8eebd82SJames Collins        // Add Mikio Section titles
17563a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
17579cff245bSJames Collins            $admin_sections = [
1758ab45ba71SJames Collins                // Section      Insert Before                 Icon
17599cff245bSJames Collins                'navbar'        => ['navbarUseTitleIcon',      ''],
17609cff245bSJames Collins                'search'        => ['searchButton',            ''],
17619cff245bSJames Collins                'hero'          => ['heroTitle',               ''],
17629cff245bSJames Collins                'tags'          => ['tagsConsolidate',         ''],
17639cff245bSJames Collins                'breadcrumb'    => ['breadcrumbHideHome',      ''],
17649cff245bSJames Collins                'youarehere'    => ['youarehereHideHome',      ''],
17659cff245bSJames Collins                'sidebar'       => ['sidebarShowLeft',         ''],
17669cff245bSJames Collins                'toc'           => ['tocFull',                 ''],
17679cff245bSJames Collins                'pagetools'     => ['pageToolsFloating',       ''],
1768daf2cd7aSJames Collins                'footer'        => ['footerPageInfoText',      ''],
17699cff245bSJames Collins                'license'       => ['licenseType',             ''],
17709cff245bSJames Collins                'acl'           => ['includePageUseACL',       ''],
17719cff245bSJames Collins                'sticky'        => ['stickyTopHeader',         ''],
17729cff245bSJames Collins            ];
1773ab45ba71SJames Collins
1774ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
1775ab45ba71SJames Collins                $search = $items[0];
1776ab45ba71SJames Collins                $icon   = $items[1];
1777ab45ba71SJames Collins
177810b40067Snomadjimbob                $content = preg_replace(
1779adf52ebbSJames Collins                    '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/',
17809cff245bSJames Collins                    '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) .
17819cff245bSJames Collins                        tpl_getLang('config_' . $section) .
17829cff245bSJames Collins                        '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' .
17839cff245bSJames Collins                        $search . '</span>',
178410b40067Snomadjimbob                    $content
178510b40067Snomadjimbob                );
1786ab45ba71SJames Collins            }
1787bb5a3dd1SJames Collins        } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) {
1788ad182e6dSnomadjimbob            $mikioPluginMissing = true;
1789ad182e6dSnomadjimbob            /* Hide plugin fields if not installed */
17909ffe9161Snomadjimbob            if (plugin_load('action', 'mikioplugin') !== null) {
1791ad182e6dSnomadjimbob                $mikioPluginMissing = false;
1792ad182e6dSnomadjimbob            }
1793ad182e6dSnomadjimbob
1794cee81679SJames Collins            $style_headers = [
1795f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__text_'],
1796f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__code_'],
1797f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__control_'],
1798f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__topheader_'],
1799f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__navbar_'],
1800f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar_'],
1801f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__tag_background_color_'],
1802f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb_'],
1803f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__hero_'],
1804f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__sidebar_'],
1805f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__content_'],
1806f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__toc_'],
1807f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__pagetools_'],
1808f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__footer_'],
1809f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__table_'],
1810f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__dropdown_'],
1811f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__section_edit_'],
1812f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__tree_'],
1813f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__tab_'],
1814ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin', 'starts_with' => '__plugin_', 'heading' => 'h2',
18159ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18169ffe9161Snomadjimbob                ],
1817ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_primary_', 'hidden' => $mikioPluginMissing],
1818ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_secondary_',
18199ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18209ffe9161Snomadjimbob                ],
1821ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_success_', 'hidden' => $mikioPluginMissing],
1822ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_danger_', 'hidden' => $mikioPluginMissing],
1823ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_warning_', 'hidden' => $mikioPluginMissing],
1824ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_info_', 'hidden' => $mikioPluginMissing],
1825ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_light_', 'hidden' => $mikioPluginMissing],
1826ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_dark_', 'hidden' => $mikioPluginMissing],
1827ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_link_', 'hidden' => $mikioPluginMissing],
1828ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_carousel_', 'hidden' => $mikioPluginMissing],
1829ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_steps_', 'hidden' => $mikioPluginMissing],
1830ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_tabgroup_', 'hidden' => $mikioPluginMissing],
1831ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_tooltip_', 'hidden' => $mikioPluginMissing],
1832cee81679SJames Collins                ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'],
1833f65a4e5eSJames Collins                ['title' => 'Base', 'starts_with' => '__darkmode_text_'],
1834f65a4e5eSJames Collins                ['title' => 'Code', 'starts_with' => '__darkmode_code_'],
1835f65a4e5eSJames Collins                ['title' => 'Controls', 'starts_with' => '__darkmode_control_'],
1836f65a4e5eSJames Collins                ['title' => 'Header', 'starts_with' => '__darkmode_topheader_'],
1837f65a4e5eSJames Collins                ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar_'],
1838f65a4e5eSJames Collins                ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar_'],
1839f65a4e5eSJames Collins                ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color_'],
1840f65a4e5eSJames Collins                ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb_'],
1841f65a4e5eSJames Collins                ['title' => 'Hero', 'starts_with' => '__darkmode_hero_'],
1842f65a4e5eSJames Collins                ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar_'],
1843f65a4e5eSJames Collins                ['title' => 'Content', 'starts_with' => '__darkmode_content_'],
1844f65a4e5eSJames Collins                ['title' => 'TOC', 'starts_with' => '__darkmode_toc_'],
1845f65a4e5eSJames Collins                ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools_'],
1846f65a4e5eSJames Collins                ['title' => 'Footer', 'starts_with' => '__darkmode_footer_'],
1847f65a4e5eSJames Collins                ['title' => 'Table', 'starts_with' => '__darkmode_table_'],
1848f65a4e5eSJames Collins                ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown_'],
1849f65a4e5eSJames Collins                ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit_'],
1850f65a4e5eSJames Collins                ['title' => 'Tree', 'starts_with' => '__darkmode_tree_'],
1851f65a4e5eSJames Collins                ['title' => 'Tabs', 'starts_with' => '__darkmode_tab_'],
1852ad182e6dSnomadjimbob                ['title' => 'Mikio Plugin (Dark mode)', 'starts_with' => '__plugin_darkmode_', 'heading' => 'h2',
18539ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18549ffe9161Snomadjimbob                ],
1855ad182e6dSnomadjimbob                ['title' => 'Primary Colours', 'starts_with' => '__plugin_darkmode_primary_',
18569ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18579ffe9161Snomadjimbob                ],
1858ad182e6dSnomadjimbob                ['title' => 'Secondary Colours', 'starts_with' => '__plugin_darkmode_secondary_',
18599ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18609ffe9161Snomadjimbob                ],
1861ad182e6dSnomadjimbob                ['title' => 'Success Colours', 'starts_with' => '__plugin_darkmode_success_',
18629ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18639ffe9161Snomadjimbob                ],
1864ad182e6dSnomadjimbob                ['title' => 'Danger Colours', 'starts_with' => '__plugin_darkmode_danger_',
18659ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18669ffe9161Snomadjimbob                ],
1867ad182e6dSnomadjimbob                ['title' => 'Warning Colours', 'starts_with' => '__plugin_darkmode_warning_',
18689ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18699ffe9161Snomadjimbob                ],
1870ad182e6dSnomadjimbob                ['title' => 'Info Colours', 'starts_with' => '__plugin_darkmode_info_',
18719ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18729ffe9161Snomadjimbob                ],
1873ad182e6dSnomadjimbob                ['title' => 'Light Colours', 'starts_with' => '__plugin_darkmode_light_',
18749ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18759ffe9161Snomadjimbob                ],
1876ad182e6dSnomadjimbob                ['title' => 'Dark Colours', 'starts_with' => '__plugin_darkmode_dark_',
18779ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18789ffe9161Snomadjimbob                ],
1879ad182e6dSnomadjimbob                ['title' => 'Link Colours', 'starts_with' => '__plugin_darkmode_link_',
18809ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18819ffe9161Snomadjimbob                ],
1882ad182e6dSnomadjimbob                ['title' => 'Carousel', 'starts_with' => '__plugin_darkmode_carousel_',
18839ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18849ffe9161Snomadjimbob                ],
1885ad182e6dSnomadjimbob                ['title' => 'Steps', 'starts_with' => '__plugin_darkmode_steps_', 'hidden' => $mikioPluginMissing],
1886ad182e6dSnomadjimbob                ['title' => 'Tabgroup', 'starts_with' => '__plugin_darkmode_tabgroup_',
18879ffe9161Snomadjimbob                    'hidden' => $mikioPluginMissing
18889ffe9161Snomadjimbob                ],
1889ad182e6dSnomadjimbob                ['title' => 'Tooltip', 'starts_with' => '__plugin_darkmode_tooltip_', 'hidden' => $mikioPluginMissing],
1890cee81679SJames Collins            ];
1891cee81679SJames Collins
1892cee81679SJames Collins            foreach ($style_headers as $header) {
1893cee81679SJames Collins                if (array_key_exists('heading', $header) === false) {
1894cee81679SJames Collins                    $header['heading'] = 'h3';
1895cee81679SJames Collins                }
1896cee81679SJames Collins
1897ad182e6dSnomadjimbob                if (array_key_exists('hidden', $header) === false) {
1898ad182e6dSnomadjimbob                    $header['hidden'] = false;
1899ad182e6dSnomadjimbob                }
1900ad182e6dSnomadjimbob
19011244e3ceSJames Collins                $content = preg_replace(
1902f65a4e5eSJames Collins                    '/(<tr>\s*<td>\s*<label for="tpl__' . $header['starts_with'] . '.+?<\/tr>)/s',
19039ffe9161Snomadjimbob                    '</tbody></table><' . $header['heading'] . ' style="display:' .
19049ffe9161Snomadjimbob                    ($header['hidden'] === true ? 'none' : 'block') . '">' .
19059ffe9161Snomadjimbob                    $header['title'] . '</' . $header['heading'] . '>
1906ad182e6dSnomadjimbob                    <table style="display:' . ($header['hidden'] === true ? 'none' : 'table') . '"><tbody>$1',
19071244e3ceSJames Collins                    $content,
19081244e3ceSJames Collins                    1
19091244e3ceSJames Collins                );
1910cee81679SJames Collins            }
1911f65a4e5eSJames Collins
1912dea1f088SJames Collins            $content = preg_replace_callback('/<input type="color"[^>]*>/', function ($match) {
1913dea1f088SJames Collins                // Get the ID of the <input type="color"> element
1914dea1f088SJames Collins                preg_match('/id="([^"]*)"/', $match[0], $matches);
1915dea1f088SJames Collins
1916dea1f088SJames Collins                // Replace type with text and remove the id attribute
19172c87ab0dSJames Collins                $replacement = preg_replace(
19182c87ab0dSJames Collins                    ['/type="color"/', '/id="([^"]*)"/'],
19192c87ab0dSJames Collins                    ['type="text" class="mikio-color-text-input"', 'for="$1"'],
19202c87ab0dSJames Collins                    $match[0]
19212c87ab0dSJames Collins                );
1922dea1f088SJames Collins
1923dea1f088SJames Collins                return '<div class="mikio-color-picker">' . $replacement . $match[0] . '</div>';
1924dea1f088SJames Collins            }, $content);
1925bb5a3dd1SJames Collins        }//end if
1926ab45ba71SJames Collins
19273a385f2cSJames Collins        if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
1928a8eebd82SJames Collins            $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content);
1929a8eebd82SJames Collins        }
1930ab45ba71SJames Collins
1931a8eebd82SJames Collins        // Page Revisions - Table Fix
19329cff245bSJames Collins        if (strpos($content, 'id="page__revisions"') !== false) {
19339cff245bSJames Collins            $content = preg_replace(
19349cff245bSJames Collins                '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/',
19359cff245bSJames Collins                '<span>$1</span>',
19369cff245bSJames Collins                $content
19379cff245bSJames Collins            );
1938a8eebd82SJames Collins        }
1939ab45ba71SJames Collins
19409cff245bSJames Collins        $html = new \simple_html_dom();
1941bc1032d9SJames Collins        $html->stripRNAttrValues = false;
1942c165b184SJames Collins        $html->load($content, true, false);
1943c165b184SJames Collins
19449cff245bSJames Collins        if ($html === false) {
19459cff245bSJames Collins            return $content;
19469cff245bSJames Collins        }
1947ab45ba71SJames Collins
1948ab45ba71SJames Collins        /* Buttons */
1949ab45ba71SJames Collins        foreach ($html->find('#config__manager button') as $node) {
1950ab45ba71SJames Collins            $c = explode(' ', $node->class);
19519cff245bSJames Collins            if (in_array('mikio-button', $c) === false) {
19529cff245bSJames Collins                $c[] = 'mikio-button';
19539cff245bSJames Collins            }
1954ab45ba71SJames Collins            $node->class = implode(' ', $c);
1955c165b184SJames Collins        }
1956c165b184SJames Collins
1957ab45ba71SJames Collins
1958ab45ba71SJames Collins        /* Buttons - Primary */
1959ab45ba71SJames Collins        foreach ($html->find('#config__manager [type=submit]') as $node) {
1960ab45ba71SJames Collins            $c = explode(' ', $node->class);
19619cff245bSJames Collins            if (in_array('mikio-primary', $c) === false) {
19629cff245bSJames Collins                $c[] = 'mikio-primary';
19639cff245bSJames Collins            }
1964ab45ba71SJames Collins            $node->class = implode(' ', $c);
1965ab45ba71SJames Collins        }
1966ab45ba71SJames Collins
1967a8eebd82SJames Collins        /* Hide page title if hero is enabled */
19689cff245bSJames Collins        if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
19691785fc73SJames Collins            $pageTitle = $this->parsePageTitle();
197047161538SJames Collins
197147161538SJames Collins            foreach ($html->find('h1,h2,h3,h4') as $elm) {
19729cff245bSJames Collins                if ($elm->innertext === $pageTitle) {
1973a8eebd82SJames Collins                    // $elm->innertext = '';
1974a8eebd82SJames Collins                    $elm->setAttribute('style', 'display:none');
1975a8eebd82SJames Collins
197647161538SJames Collins                    break;
197747161538SJames Collins                }
197847161538SJames Collins            }
197947161538SJames Collins        }
1980c165b184SJames Collins
1981a8eebd82SJames Collins        /* Hero subtitle */
19822b4583abSJames Collins        foreach ($html->find('p') as $elm) {
1983d0d6c450SJames Collins            if (preg_match('/[~-]~hero-subtitle (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
1984d0d6c450SJames Collins                $subtitle = $matches[1];
1985a8eebd82SJames Collins                $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
1986a8eebd82SJames Collins
1987d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-subtitle (.+?)~[~-]/ui', '', $elm->innertext);
19882b4583abSJames Collins                break;
19892b4583abSJames Collins            }
19902b4583abSJames Collins        }
19912b4583abSJames Collins
1992a8eebd82SJames Collins        /* Hero image */
1993a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
1994a8eebd82SJames Collins            $image = '';
1995d0d6c450SJames Collins            preg_match('/[~-]~hero-image (.+?)~[~-](?!.?")/ui', $elm->innertext, $matches);
1996a8eebd82SJames Collins            if (count($matches) > 0) {
1997a8eebd82SJames Collins                preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches);
1998a8eebd82SJames Collins                if (count($imageTagMatches) > 0) {
1999a8eebd82SJames Collins                    $image = $imageTagMatches[1];
2000a8eebd82SJames Collins                } else {
2001a8eebd82SJames Collins                    preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches);
2002a8eebd82SJames Collins                    if (count($imageTagMatches) > 0) {
2003a8eebd82SJames Collins                        $image = $imageTagMatches[1];
2004a8eebd82SJames Collins                    } else {
2005a8eebd82SJames Collins                        $image = strip_tags($matches[1]);
20069cff245bSJames Collins                        if (stripos($image, ':') === false) {
20079cff245bSJames Collins                            $image = str_replace(['{', '}'], '', $image);
2008a8eebd82SJames Collins                            $i = stripos($image, '?');
20099cff245bSJames Collins                            if ($i !== false) {
2010a8eebd82SJames Collins                                $image = substr($image, 0, $i);
2011c165b184SJames Collins                            }
2012c165b184SJames Collins
2013a8eebd82SJames Collins                            $image = ml($image, '', true, '', false);
2014ab45ba71SJames Collins                        }
2015ab45ba71SJames Collins                    }
2016ab45ba71SJames Collins                }
2017ab45ba71SJames Collins
2018a8eebd82SJames Collins                $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
2019a8eebd82SJames Collins
2020d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-image (.+?)~[~-].*/ui', '', $elm->innertext);
20219cff245bSJames Collins            }//end if
20229cff245bSJames Collins        }//end foreach
2023ab45ba71SJames Collins
20249cff245bSJames Collins        /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
20259cff245bSJames Collins        [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
2026a8eebd82SJames Collins        foreach ($html->find('p') as $elm) {
2027d0d6c450SJames Collins            if (preg_match('/[~-]~hero-colors (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
2028d0d6c450SJames Collins                $subtitle = $matches[1];
2029d0d6c450SJames Collins                $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $subtitle . '\')';
2030ab45ba71SJames Collins
2031d0d6c450SJames Collins                $elm->innertext = preg_replace('/[~-]~hero-colors (.+?)~[~-]/ui', '', $elm->innertext);
2032a8eebd82SJames Collins                break;
2033ab45ba71SJames Collins            }
2034ab45ba71SJames Collins        }
2035ab45ba71SJames Collins
203696ec8e1eSJames Collins        /* Hide parts - ~~hide-parts [parts]~~  */
203796ec8e1eSJames Collins        foreach ($html->find('p') as $elm) {
20383a44a74aSJames Collins            if (preg_match('/[~-]~hide-parts (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) {
2039d0d6c450SJames Collins                $parts = explode(' ', $matches[1]);
204096ec8e1eSJames Collins                $script = '';
204196ec8e1eSJames Collins
204296ec8e1eSJames Collins                foreach ($parts as $part) {
204396ec8e1eSJames Collins                    if (strlen($part) > 0) {
204496ec8e1eSJames Collins                        $script .= 'mikio.hidePart(\'' . $part . '\');';
204596ec8e1eSJames Collins                    }
204696ec8e1eSJames Collins                }
204796ec8e1eSJames Collins
204896ec8e1eSJames Collins                if (strlen($script) > 0) {
204996ec8e1eSJames Collins                    $this->footerScript['hide-parts'] = $script;
205096ec8e1eSJames Collins                }
205196ec8e1eSJames Collins
20523a44a74aSJames Collins                $elm->innertext = preg_replace('/[~-]~hide-parts (.+?)~[~-]/ui', '', $elm->innertext);
205396ec8e1eSJames Collins                break;
2054d0d6c450SJames Collins            }
20559cff245bSJames Collins        }//end foreach
205696ec8e1eSJames Collins
205796ec8e1eSJames Collins
2058a8eebd82SJames Collins        /* Page Tags (tag plugin) */
20599cff245bSJames Collins        if ($this->getConf('tagsConsolidate') === true) {
2060a8eebd82SJames Collins            $tags = '';
2061a8eebd82SJames Collins            foreach ($html->find('div.tags a') as $elm) {
2062a8eebd82SJames Collins                $tags .= $elm->outertext;
2063a8eebd82SJames Collins            }
2064a8eebd82SJames Collins
2065a8eebd82SJames Collins            foreach ($html->find('div.tags') as $elm) {
2066a8eebd82SJames Collins                $elm->innertext = '';
2067a8eebd82SJames Collins                $elm->setAttribute('style', 'display:none');
2068a8eebd82SJames Collins            }
2069a8eebd82SJames Collins
20703a385f2cSJames Collins            if (empty($tags) === false) {
2071a8eebd82SJames Collins                $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
2072a8eebd82SJames Collins            }
2073ab45ba71SJames Collins        }
2074ab45ba71SJames Collins
2075ab45ba71SJames Collins        // Configuration Manager
20763a385f2cSJames Collins        if (strcasecmp($INPUT->str('page'), 'config') === 0) {
2077ab45ba71SJames Collins            // Additional save buttons
2078ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
2079ab45ba71SJames Collins                $saveButtons = '';
2080ab45ba71SJames Collins
2081ab45ba71SJames Collins                foreach ($cm->find('p') as $elm) {
2082ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
2083a8eebd82SJames Collins                    $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons);
2084ab45ba71SJames Collins                    $elm->outertext = '';
2085ab45ba71SJames Collins                }
2086ab45ba71SJames Collins
2087ab45ba71SJames Collins                foreach ($cm->find('fieldset') as $elm) {
2088ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
2089ab45ba71SJames Collins                }
2090ab45ba71SJames Collins            }
2091ab45ba71SJames Collins        }
2092ab45ba71SJames Collins
2093ab45ba71SJames Collins        $content = $html->save();
2094c165b184SJames Collins        $html->clear();
2095c165b184SJames Collins        unset($html);
2096c165b184SJames Collins
2097c165b184SJames Collins        return $content;
2098c165b184SJames Collins    }
20992b4583abSJames Collins
21002b4583abSJames Collins
2101a8eebd82SJames Collins    /**
2102a8eebd82SJames Collins     * Get DokuWiki namespace/page/URI as link
2103a8eebd82SJames Collins     *
21049cff245bSJames Collins     * @param   string $str String to parse.
21059cff245bSJames Collins     * @return  string      parsed URI
2106a8eebd82SJames Collins     */
21079cff245bSJames Collins    public function getLink(string $str)
210810b40067Snomadjimbob    {
21092b4583abSJames Collins        $i = strpos($str, '://');
21109cff245bSJames Collins        if ($i !== false) {
21119cff245bSJames Collins            return $str;
21129cff245bSJames Collins        }
21132b4583abSJames Collins
21142b4583abSJames Collins        return wl($str);
21152b4583abSJames Collins    }
2116ab45ba71SJames Collins
2117ab45ba71SJames Collins
2118a8eebd82SJames Collins    /**
2119a8eebd82SJames Collins     * Check if the user can edit current namespace/page
2120a8eebd82SJames Collins     *
2121a8eebd82SJames Collins     * @return  boolean  user can edit
2122a8eebd82SJames Collins     */
212310b40067Snomadjimbob    public function userCanEdit()
212410b40067Snomadjimbob    {
2125ab45ba71SJames Collins        global $INFO;
2126ab45ba71SJames Collins        global $ID;
2127ab45ba71SJames Collins
2128ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
21299cff245bSJames Collins        if (@file_exists($wiki_file) === false) {
21309cff245bSJames Collins            return true;
21319cff245bSJames Collins        }
21329cff245bSJames Collins        if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
21339cff245bSJames Collins            return true;
21349cff245bSJames Collins        }
2135a8eebd82SJames Collins        // $meta_file = metaFN($ID, '.meta');
21369cff245bSJames Collins        if ($INFO['meta']['user'] === false) {
21379cff245bSJames Collins            return true;
21389cff245bSJames Collins        }
21399cff245bSJames Collins        if ($INFO['client'] === $INFO['meta']['user']) {
21409cff245bSJames Collins            return true;
21419cff245bSJames Collins        }
2142ab45ba71SJames Collins
2143ab45ba71SJames Collins        return false;
2144c165b184SJames Collins    }
214547161538SJames Collins
214647161538SJames Collins
2147a8eebd82SJames Collins    /**
2148a8eebd82SJames Collins     * Search for and return the uri of a media file
2149a8eebd82SJames Collins     *
21509cff245bSJames Collins     * @param string  $image           Image name to search for (without extension).
21519cff245bSJames Collins     * @param boolean $searchCurrentNS Search the current namespace.
21529cff245bSJames Collins     * @param boolean $propagate       Propagate search through the namespace.
21539cff245bSJames Collins     * @return string                  URI of the found media file
2154a8eebd82SJames Collins     */
21559cff245bSJames Collins    public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
215610b40067Snomadjimbob    {
2157ab45ba71SJames Collins        global $INFO;
2158a8eebd82SJames Collins
21599cff245bSJames Collins        $ext = ['png', 'jpg', 'gif', 'svg'];
2160ab45ba71SJames Collins
21619cff245bSJames Collins        if ($searchCurrentNS === true) {
21629cff245bSJames Collins            $prefix[] = ':' . $INFO['namespace'] . ':';
21639cff245bSJames Collins        }
21649cff245bSJames Collins        if ($propagate === true) {
2165ab45ba71SJames Collins            $prefix[] = ':';
2166ab45ba71SJames Collins            $prefix[] = ':wiki:';
2167a8eebd82SJames Collins        }
2168ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
21693a385f2cSJames Collins        if (empty($theme) === false) {
21709cff245bSJames Collins            $prefix[] = 'themes/' . $theme . '/images/';
21719cff245bSJames Collins        }
2172ab45ba71SJames Collins        $prefix[] = 'images/';
2173ab45ba71SJames Collins
21749cff245bSJames Collins        $search = [];
2175ab45ba71SJames Collins        foreach ($prefix as $pitem) {
2176ab45ba71SJames Collins            foreach ($ext as $eitem) {
2177ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
2178ab45ba71SJames Collins            }
2179ab45ba71SJames Collins        }
2180ab45ba71SJames Collins
2181ab45ba71SJames Collins        $img = '';
2182ab45ba71SJames Collins        $file = '';
2183ab45ba71SJames Collins        $url = '';
2184ab45ba71SJames Collins        $ismedia = false;
2185ab45ba71SJames Collins        $found = false;
2186ab45ba71SJames Collins
2187ab45ba71SJames Collins        foreach ($search as $img) {
21883a385f2cSJames Collins            if (strcasecmp(substr($img, 0, 1), ':') === 0) {
2189ab45ba71SJames Collins                $file    = mediaFN($img);
2190ab45ba71SJames Collins                $ismedia = true;
2191ab45ba71SJames Collins            } else {
2192ab45ba71SJames Collins                $file    = tpl_incdir() . $img;
2193ab45ba71SJames Collins                $ismedia = false;
2194ab45ba71SJames Collins            }
2195ab45ba71SJames Collins
21969cff245bSJames Collins            if (file_exists($file) === true) {
2197ab45ba71SJames Collins                $found = true;
2198ab45ba71SJames Collins                break;
2199ab45ba71SJames Collins            }
2200ab45ba71SJames Collins        }
2201ab45ba71SJames Collins
22029cff245bSJames Collins        if ($found === false) {
22039cff245bSJames Collins            return false;
22049cff245bSJames Collins        }
2205ab45ba71SJames Collins
22069cff245bSJames Collins        if ($ismedia === true) {
2207ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
2208ab45ba71SJames Collins        } else {
2209ab45ba71SJames Collins            $url = tpl_basedir() . $img;
2210ab45ba71SJames Collins        }
2211ab45ba71SJames Collins
2212ab45ba71SJames Collins        return $url;
2213ab45ba71SJames Collins    }
2214ab45ba71SJames Collins
2215a8eebd82SJames Collins
2216a8eebd82SJames Collins    /**
2217ab45ba71SJames Collins     * Print or return the page title
2218ab45ba71SJames Collins     *
22199cff245bSJames Collins     * @param string $page Page id or empty string for current page.
2220ab45ba71SJames Collins     * @return string      generated content
2221ab45ba71SJames Collins     */
22229cff245bSJames Collins    public function getPageTitle(string $page = '')
222310b40067Snomadjimbob    {
2224ab45ba71SJames Collins        global $ID, $conf;
2225ab45ba71SJames Collins
2226ab45ba71SJames Collins        $html = '';
2227ab45ba71SJames Collins
22283a385f2cSJames Collins        if (empty($page) === true) {
22299cff245bSJames Collins            $page = $ID;
22309cff245bSJames Collins        }
2231ab45ba71SJames Collins
2232ab45ba71SJames Collins        $html = p_get_first_heading($page);
2233ab45ba71SJames Collins        $html = strip_tags($html);
2234ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
2235ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
2236ab45ba71SJames Collins        $html = trim($html);
2237ab45ba71SJames Collins
2238ab45ba71SJames Collins        return $html;
2239ab45ba71SJames Collins    }
2240a8eebd82SJames Collins
2241a8eebd82SJames Collins
2242a8eebd82SJames Collins    /**
2243a8eebd82SJames Collins     * Return inline theme icon
2244a8eebd82SJames Collins     *
22459cff245bSJames Collins     * @param   string $type  Icon to retreive.
22469e41d878SJames Collins     * @param   string $class Classname to insert.
22479cff245bSJames Collins     * @return  string        HTML icon content
2248a8eebd82SJames Collins     */
22499e41d878SJames Collins    public function mikioInlineIcon(string $type, string $class = "")
225010b40067Snomadjimbob    {
22519e41d878SJames Collins        if (is_array($class) === true) {
22529e41d878SJames Collins            $class = explode(' ', $class);
22539e41d878SJames Collins        }
22549e41d878SJames Collins
22559e41d878SJames Collins        if (strlen($class) > 0) {
22569e41d878SJames Collins            $class = ' ' . $class;
22579e41d878SJames Collins        }
22589e41d878SJames Collins
2259a8eebd82SJames Collins        switch ($type) {
2260a8eebd82SJames Collins            case 'wrench':
2261906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792
2262906e1a13SJames Collins1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,53.152542,1217.0847)"><path d="m 384,64 q 0,26 -19,45 -19,
2263906e1a13SJames Collins19 -45,19 -26,0 -45,-19 -19,-19 -19,-45 0,-26 19,-45 19,-19 45,-19 26,0 45,19 19,19 19,45 z m 644,420 -682,-682 q -37,
2264906e1a13SJames Collins-37 -90,-37 -52,0 -91,37 L 59,-90 Q 21,-54 21,0 21,53 59,91 L 740,772 Q 779,674 854.5,598.5 930,523 1028,484 z m 634,
2265906e1a13SJames Collins435 q 0,-39 -23,-106 Q 1592,679 1474.5,595.5 1357,512 1216,512 1031,512 899.5,643.5 768,775 768,960 q 0,185 131.5,316.5
2266906e1a13SJames Collins131.5,131.5 316.5,131.5 58,0 121.5,-16.5 63.5,-16.5 107.5,-46.5 16,-11 16,-28 0,-17 -16,-28 L 1152,1120 V 896 l 193,
2267906e1a13SJames Collins-107 q 5,3 79,48.5 74,45.5 135.5,81 61.5,35.5 70.5,35.5 15,0 23.5,-10 8.5,-10 8.5,-25 z"/></g></svg>';
2268a8eebd82SJames Collins            case 'file':
2269906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2270906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991">
2271906e1a13SJames Collins<path d="M 128,0 H 1152 V 768 H 736 q -40,0 -68,28 -28,28 -28,68 v 416 H 128 V 0 z m 640,896 h 299 L 768,1195 V 896 z M
2272906e1a13SJames Collins1280,768 V -32 q 0,-40 -28,-68 -28,-28 -68,-28 H 96 q -40,0 -68,28 -28,28 -28,68 v 1344 q 0,40 28,68 28,28 68,28 h 544
2273906e1a13SJames Collinsq 40,0 88,-20 48,-20 76,-48 l 408,-408 q 28,-28 48,-76 20,-48 20,-88 z" id="path2993" inkscape:connector-curvature="0"
22749cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
2275a8eebd82SJames Collins            case 'gear':
2276906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2277906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027">
2278906e1a13SJames Collins<path d="m 1024,640 q 0,106 -75,181 -75,75 -181,75 -106,0 -181,-75 -75,-75 -75,-181 0,-106 75,-181 75,-75 181,-75 106,0
2279906e1a13SJames Collins181,75 75,75 75,181 z m 512,109 V 527 q 0,-12 -8,-23 -8,-11 -20,-13 l -185,-28 q -19,-54 -39,-91 35,-50 107,-138 10,-12
2280906e1a13SJames Collins10,-25 0,-13 -9,-23 -27,-37 -99,-108 -72,-71 -94,-71 -12,0 -26,9 l -138,108 q -44,-23 -91,-38 -16,-136 -29,-186 -7,-28
2281906e1a13SJames Collins-36,-28 H 657 q -14,0 -24.5,8.5 Q 622,-111 621,-98 L 593,86 q -49,16 -90,37 L 362,16 Q 352,7 337,7 323,7 312,18 186,132
2282906e1a13SJames Collins147,186 q -7,10 -7,23 0,12 8,23 15,21 51,66.5 36,45.5 54,70.5 -27,50 -41,99 L 29,495 Q 16,497 8,507.5 0,518 0,531 v 222
2283906e1a13SJames Collinsq 0,12 8,23 8,11 19,13 l 186,28 q 14,46 39,92 -40,57 -107,138 -10,12 -10,24 0,10 9,23 26,36 98.5,107.5 72.5,71.5 94.5,
2284906e1a13SJames Collins71.5 13,0 26,-10 l 138,-107 q 44,23 91,38 16,136 29,186 7,28 36,28 h 222 q 14,0 24.5,-8.5 Q 914,1391 915,1378 l 28,-184
2285906e1a13SJames Collinsq 49,-16 90,-37 l 142,107 q 9,9 24,9 13,0 25,-10 129,-119 165,-170 7,-8 7,-22 0,-12 -8,-23 -15,-21 -51,-66.5 -36,-45.5
2286906e1a13SJames Collins-54,-70.5 26,-50 41,-98 l 183,-28 q 13,-2 21,-12.5 8,-10.5 8,-23.5 z" id="path3029" inkscape:connector-curvature="0" />
2287906e1a13SJames Collins</g></svg>';
2288a8eebd82SJames Collins            case 'user':
2289906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2290906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M
2291906e1a13SJames Collins1408,131 Q 1408,11 1335,-58.5 1262,-128 1141,-128 H 267 Q 146,-128 73,-58.5 0,11 0,131 0,184 3.5,234.5 7,285 17.5,343.5
2292906e1a13SJames Collins28,402 44,452 q 16,50 43,97.5 27,47.5 62,81 35,33.5 85.5,53.5 50.5,20 111.5,20 9,0 42,-21.5 33,-21.5 74.5,-48 41.5,
2293906e1a13SJames Collins-26.5 108,-48 Q 637,565 704,565 q 67,0 133.5,21.5 66.5,21.5 108,48 41.5,26.5 74.5,48 33,21.5 42,21.5 61,0 111.5,-20
2294906e1a13SJames Collins50.5,-20 85.5,-53.5 35,-33.5 62,-81 27,-47.5 43,-97.5 16,-50 26.5,-108.5 10.5,-58.5 14,-109 Q 1408,184 1408,131 z m
2295906e1a13SJames Collins-320,893 Q 1088,865 975.5,752.5 863,640 704,640 545,640 432.5,752.5 320,865 320,1024 320,1183 432.5,1295.5 545,1408 704,
2296906e1a13SJames Collins1408 863,1408 975.5,1295.5 1088,1183 1088,1024 z"/></g></svg>';
2297a8eebd82SJames Collins            case 'search':
22989e41d878SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
22999cff245bSJames 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
23009cff245bSJames 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
23019cff245bSJames 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
23029cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>';
2303a8eebd82SJames Collins            case 'home':
2304906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2305906e1a13SJames CollinsviewBox="0 -256 1792 1792" aria-hidden="true" style="fill:currentColor"><g
2306906e1a13SJames Collinstransform="matrix(1,0,0,-1,68.338983,1285.4237)" id="g3015"><path d="M 1408,544 V 64 Q 1408,38 1389,19 1370,0 1344,0 H
2307906e1a13SJames Collins960 V 384 H 704 V 0 H 320 q -26,0 -45,19 -19,19 -19,45 v 480 q 0,1 0.5,3 0.5,2 0.5,3 l 575,474 575,-474 q 1,-2 1,-6 z
2308906e1a13SJames Collinsm 223,69 -62,-74 q -8,-9 -21,-11 h -3 q -13,0 -21,7 L 832,1112 140,535 q -12,-8 -24,-7 -13,2 -21,11 l -62,74 q -8,10
2309906e1a13SJames Collins-7,23.5 1,13.5 11,21.5 l 719,599 q 32,26 76,26 44,0 76,-26 l 244,-204 v 195 q 0,14 9,23 9,9 23,9 h 192 q 14,0 23,-9 9,
2310906e1a13SJames Collins-9 9,-23 V 840 l 219,-182 q 10,-8 11,-21.5 1,-13.5 -7,-23.5 z" id="path3017" inkscape:connector-curvature="0"
23119cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>';
23129e41d878SJames Collins            case 'sun':
2313906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2314906e1a13SJames Collinsstyle="fill:currentColor" viewBox="0 0 16 16"><path d="M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0
2315906e1a13SJames Collins0 8zm.5-9.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm0 11a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm5-5a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-11
2316906e1a13SJames Collins0a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm9.743-4.036a.5.5 0 1 1-.707-.707.5.5 0 0 1 .707.707zm-7.779 7.779a.5.5 0 1
2317906e1a13SJames Collins1-.707-.707.5.5 0 0 1 .707.707zm7.072 0a.5.5 0 1 1 .707-.707.5.5 0 0 1-.707.707zM3.757 4.464a.5.5 0 1 1 .707-.707.5.5
2318906e1a13SJames Collins0 0 1-.707.707z" /></svg>';
23199e41d878SJames Collins            case 'moon':
2320906e1a13SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2321906e1a13SJames Collinsstyle="fill:currentColor" viewBox="0 0 16 16"><path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0
2322906e1a13SJames Collins4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0
2323906e1a13SJames Collins1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278zM4.858 1.311A7.269 7.269 0 0 0
2324906e1a13SJames Collins1.025 7.71c0 4.02 3.279 7.276 7.319 7.276a7.316 7.316 0 0 0 5.205-2.162c-.337.042-.68.063-1.029.063-4.61
2325906e1a13SJames Collins0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>';
232634d5f19aSJames Collins            case 'sunmoon':
2327d0fba6d1SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg"
2328d0fba6d1SJames Collinsstyle="fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"
2329d0fba6d1SJames CollinsviewBox="0 0 32 32"><line x1="16" y1="3" x2="16" y2="29"/><path d="M16,23c-3.87,0-7-3.13-7-7s3.13-7,7-7"/><line
2330d0fba6d1SJames Collinsx1="6.81" y1="6.81" x2="8.93" y2="8.93"/><line x1="3" y1="16" x2="6" y2="16"/><line x1="6.81" y1="25.19" x2="8.93"
2331d0fba6d1SJames Collinsy2="23.07"/><path d="M16,12.55C17.2,10.43,19.48,9,22.09,9c0.16,0,0.31,0.01,0.47,0.02c-1.67,0.88-2.8,2.63-2.8,4.64c0,2.9,
2332d0fba6d1SJames Collins2.35,5.25,5.25,5.25c1.6,0,3.03-0.72,3.99-1.85C28.48,20.43,25.59,23,22.09,23c-2.61,0-4.89-1.43-6.09-3.55"/></svg>';
2333f65a4e5eSJames Collins            case 'hamburger':
2334f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
2335f65a4e5eSJames Collinsstyle="fill:currentColor"><path d="M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0
2336f65a4e5eSJames Collins76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16
2337f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16
2338f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16z"/></svg>';
2339f65a4e5eSJames Collins            case 'down-arrow':
2340f65a4e5eSJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"
2341f65a4e5eSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M16.003 18.626l7.081-7.081L25 13.46l-8.997 8.998-9.003-9
2342f65a4e5eSJames Collins1.917-1.916z"/></svg>';
23433a3ece10SJames Collins            case 'language':
23443a3ece10SJames Collins                return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" width="16"
23453a3ece10SJames Collinsheight="16" fill="currentColor" viewBox="0 0 16 16"><path d="M4.545 6.714 4.11
23463a3ece10SJames Collins8H3l1.862-5h1.284L8 8H6.833l-.435-1.286H4.545zm1.634-.736L5.5 3.956h-.049l-.679 2.022H6.18z"/><path d="M0 2a2 2 0 0 1
23473a3ece10SJames Collins2-2h7a2 2 0 0 1 2 2v3h3a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2v-3H2a2 2 0 0 1-2-2V2zm2-1a1 1 0 0 0-1 1v7a1 1 0 0
23483a3ece10SJames Collins0 1 1h7a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H2zm7.138 9.995c.193.301.402.583.63.846-.748.575-1.673 1.001-2.768
23493a3ece10SJames Collins1.292.178.217.451.635.555.867 1.125-.359 2.08-.844 2.886-1.494.777.665 1.739 1.165 2.93
23503a3ece10SJames Collins1.472.133-.254.414-.673.629-.89-1.125-.253-2.057-.694-2.82-1.284.681-.747 1.222-1.651
23513a3ece10SJames Collins1.621-2.757H14V8h-3v1.047h.765c-.318.844-.74 1.546-1.272 2.13a6.066 6.066 0 0 1-.415-.492 1.988 1.988 0 0 1-.94.31z"/>
23523a3ece10SJames Collins</svg>';
23539cff245bSJames Collins        }//end switch
2354ab45ba71SJames Collins
2355a8eebd82SJames Collins        return '';
2356a8eebd82SJames Collins    }
2357ab45ba71SJames Collins
2358a8eebd82SJames Collins    /**
2359a8eebd82SJames Collins     * Finalize theme
23609cff245bSJames Collins     *
23619cff245bSJames Collins     * @return void
2362a8eebd82SJames Collins     */
236310b40067Snomadjimbob    public function finalize()
236410b40067Snomadjimbob    {
2365a8eebd82SJames Collins    }
23661785fc73SJames Collins
23671785fc73SJames Collins    /**
23681785fc73SJames Collins     * Show Messages
23699cff245bSJames Collins     *
23709cff245bSJames Collins     * @return void
23711785fc73SJames Collins     */
237210b40067Snomadjimbob    public function showMessages()
237310b40067Snomadjimbob    {
23741785fc73SJames Collins        global $ACT;
23751785fc73SJames Collins
23769cff245bSJames Collins        if ($this->lessIgnored === true) {
23779cff245bSJames Collins            msg(
23789cff245bSJames Collins                'useLESS is enabled on the Mikio template, however is not supported on this server',
23799cff245bSJames Collins                2,
23809cff245bSJames Collins                '',
23819cff245bSJames Collins                '',
23829cff245bSJames Collins                MSG_ADMINS_ONLY
23839cff245bSJames Collins            );
2384a8df40efSJames Collins        }
2385a8df40efSJames Collins
23861785fc73SJames Collins        $show = $this->getConf('showNotifications');
23873a385f2cSJames Collins        if (
23884f8225e4SJames Collins            strlen($show) === 0 ||
23893a385f2cSJames Collins            strcasecmp($show, 'always') === 0 ||
23903a385f2cSJames Collins            (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
23913a385f2cSJames Collins        ) {
23922d241f94SJames Collins            html_msgarea();
23931785fc73SJames Collins
23942d241f94SJames Collins            // global $MSG, $MSG_shown;
23951785fc73SJames Collins
23962d241f94SJames Collins            // if (isset($MSG) !== false) {
23972d241f94SJames Collins            //     if (isset($MSG_shown) === false) {
23982d241f94SJames Collins            //         $MSG_shown = [];
23992d241f94SJames Collins            //     }
24001785fc73SJames Collins
24012d241f94SJames Collins            //     foreach ($MSG as $msg) {
24022d241f94SJames Collins            //         $hash = md5($msg['msg']);
24032d241f94SJames Collins            //         if (isset($MSG_shown[$hash]) === true) {
24042d241f94SJames Collins            //             continue;
24052d241f94SJames Collins            //         }
24062d241f94SJames Collins            //         // skip double messages
24071785fc73SJames Collins
24082d241f94SJames Collins            //         if (info_msg_allowed($msg) === true) {
24092d241f94SJames Collins            //             echo '<div class="me ' . $msg['lvl'] . '">';
24102d241f94SJames Collins            //             echo $msg['msg'];
24112d241f94SJames Collins            //             echo '</div>';
24122d241f94SJames Collins            //         }
24131785fc73SJames Collins
24142d241f94SJames Collins            //         $MSG_shown[$hash] = true;
24152d241f94SJames Collins            //     }
24162d241f94SJames Collins
24172d241f94SJames Collins            //     unset($GLOBALS['MSG']);
24182d241f94SJames Collins            // }//end if
24194f8225e4SJames Collins
24204f8225e4SJames Collins            if (strlen($this->includedPageNotifications) > 0) {
24214f8225e4SJames Collins                echo $this->includedPageNotifications;
24224f8225e4SJames Collins            }
24234f8225e4SJames Collins        }//end if
24241785fc73SJames Collins    }
24257ac0a6efSJames Collins
24267ac0a6efSJames Collins    /**
24277ac0a6efSJames Collins     * Dokuwiki version
24287ac0a6efSJames Collins     *
24297ac0a6efSJames Collins     * @return  string        the dw version name
24307ac0a6efSJames Collins     */
24319cff245bSJames Collins    public function dwVersion()
24329cff245bSJames Collins    {
24339cff245bSJames Collins        if (function_exists('getVersionData') === true) {
24347ac0a6efSJames Collins            $version_data = getVersionData();
24359cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
24367ac0a6efSJames Collins                $version_items = explode(' ', $version_data['date']);
24377ac0a6efSJames Collins                if (count($version_items) >= 2) {
24387ac0a6efSJames Collins                    return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
24397ac0a6efSJames Collins                }
24407ac0a6efSJames Collins            }
24417ac0a6efSJames Collins        }
24427ac0a6efSJames Collins
24437ac0a6efSJames Collins        return 'unknown';
24447ac0a6efSJames Collins    }
2445e4c4fb13SJames Collins
2446e4c4fb13SJames Collins    /**
2447e4c4fb13SJames Collins     * Dokuwiki version number
2448e4c4fb13SJames Collins     *
2449e4c4fb13SJames Collins     * @return  string        the dw version date converted to integer
2450e4c4fb13SJames Collins     */
24519cff245bSJames Collins    public function dwVersionNumber()
24529cff245bSJames Collins    {
24539cff245bSJames Collins        if (function_exists('getVersionData') === true) {
2454e4c4fb13SJames Collins            $version_data = getVersionData();
24559cff245bSJames Collins            if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
2456e4c4fb13SJames Collins                $version_items = explode(' ', $version_data['date']);
2457e4c4fb13SJames Collins                if (count($version_items) >= 1) {
2458e4c4fb13SJames Collins                    return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
2459e4c4fb13SJames Collins                }
2460e4c4fb13SJames Collins            }
2461e4c4fb13SJames Collins        }
2462e4c4fb13SJames Collins
2463e4c4fb13SJames Collins        return 0;
2464e4c4fb13SJames Collins    }
2465a8eebd82SJames Collins}
2466ab45ba71SJames Collins
2467ab45ba71SJames Collinsglobal $TEMPLATE;
246847161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
2469