xref: /template/mikio/mikio.php (revision ab45ba7165dc08ce8ac280c60e4318ef9df9d00d)
1c165b184SJames Collins<?php
2c165b184SJames Collins/**
3c165b184SJames Collins * DokuWiki Mikio Template
4c165b184SJames Collins *
5c165b184SJames Collins * @link    http://dokuwiki.org/template:mikio
6c165b184SJames Collins * @author  James Collins <james.collins@outlook.com.au>
7*ab45ba71SJames Collins * @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html)
8c165b184SJames Collins */
9*ab45ba71SJames Collinsnamespace dokuwiki\template\mikio;
10c165b184SJames Collins
11c165b184SJames Collinsif (!defined('DOKU_INC')) die();
12c165b184SJames Collins
13*ab45ba71SJames Collinsrequire_once('icons/icons.php');
14c165b184SJames Collinsrequire_once('inc/simple_html_dom.php');
15c165b184SJames Collins
1647161538SJames Collinsclass Template {
17c165b184SJames Collins    public $tplDir  = '';
18c165b184SJames Collins    public $baseDir = '';
19c165b184SJames Collins
20c165b184SJames Collins
21c165b184SJames Collins    /**
22c165b184SJames Collins     * Class constructor
23c165b184SJames Collins     */
24c165b184SJames Collins    public function __construct() {
25c165b184SJames Collins      $this->tplDir  = tpl_incdir();
26c165b184SJames Collins      $this->baseDir = tpl_basedir();
27c165b184SJames Collins
28c165b184SJames Collins      $this->_registerHooks();
29c165b184SJames Collins    }
30c165b184SJames Collins
31c165b184SJames Collins
32c165b184SJames Collins    /**
33*ab45ba71SJames Collins     * Returns the instance of the class
3447161538SJames Collins     *
35*ab45ba71SJames Collins     * @return  Template        class instance
3647161538SJames Collins     */
3747161538SJames Collins    public static function getInstance()
3847161538SJames Collins    {
3947161538SJames Collins        static $instance = null;
4047161538SJames Collins
4147161538SJames Collins        if ($instance === null) {
4247161538SJames Collins            $instance = new Template();
4347161538SJames Collins        }
4447161538SJames Collins
4547161538SJames Collins        return $instance;
4647161538SJames Collins    }
4747161538SJames Collins
48*ab45ba71SJames Collins
4947161538SJames Collins    /**
50*ab45ba71SJames Collins     * Register the themes hooks into Dokuwiki
51c165b184SJames Collins     */
52c165b184SJames Collins    private function _registerHooks() {
53c165b184SJames Collins        global $EVENT_HANDLER;
54c165b184SJames Collins
55c165b184SJames Collins         $events_dispatcher = array(
56*ab45ba71SJames Collins            'TPL_METAHEADER_OUTPUT'     => 'metaheadersHandler'
57c165b184SJames Collins        );
58c165b184SJames Collins
59c165b184SJames Collins        foreach ($events_dispatcher as $event => $method) {
60c165b184SJames Collins            $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method);
61c165b184SJames Collins        }
62c165b184SJames Collins    }
63c165b184SJames Collins
64c165b184SJames Collins
65c165b184SJames Collins    /**
66*ab45ba71SJames Collins     * Meta handler hook for DokuWiki
67c165b184SJames Collins     *
68*ab45ba71SJames Collins     * @param   Doku_Event  $event
69c165b184SJames Collins     */
7047161538SJames Collins    public function metaHeadersHandler(\Doku_Event $event) {
71*ab45ba71SJames Collins        global $MIKIO_ICONS;
72*ab45ba71SJames Collins
73c165b184SJames Collins        $stylesheets    = array();
74c165b184SJames Collins        $scripts        = array();
75c165b184SJames Collins
76*ab45ba71SJames Collins        if($this->getConf('customTheme') != '') {
77*ab45ba71SJames Collins            if(file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css')) {
78*ab45ba71SJames Collins                $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css';
792b4583abSJames Collins            }
80*ab45ba71SJames Collins            if(file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js')) {
81*ab45ba71SJames Collins                $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js';
82c165b184SJames Collins            }
83c165b184SJames Collins        }
84c165b184SJames Collins
85*ab45ba71SJames Collins        if(is_array($MIKIO_ICONS)) {
86*ab45ba71SJames Collins            $icons = Array();
87*ab45ba71SJames Collins            foreach($MIKIO_ICONS as $icon) {
88*ab45ba71SJames Collins                if(isset($icon['name']) && isset($icon['css']) && isset($icon['insert'])) {
89*ab45ba71SJames Collins                    $icons[] = $icon;
90c165b184SJames Collins
91*ab45ba71SJames Collins                    if($icon['css'] != '') {
92*ab45ba71SJames Collins                        if(strpos($icon['css'], '//') === FALSE) {
93*ab45ba71SJames Collins                            // $stylesheets[] = $this->baseDir . 'icons/' . $icon['css'];
94*ab45ba71SJames Collins                        } else {
95*ab45ba71SJames Collins                            // $stylesheets[] = $icon['css'];
96*ab45ba71SJames Collins                        }
97*ab45ba71SJames Collins                    }
98*ab45ba71SJames Collins                }
99*ab45ba71SJames Collins            }
100*ab45ba71SJames Collins            $MIKIO_ICONS = $icons;
101*ab45ba71SJames Collins        } else {
102*ab45ba71SJames Collins            $MIKIO_ICONS = [];
103*ab45ba71SJames Collins        }
104c165b184SJames Collins
105*ab45ba71SJames Collins        $scripts[] = $this->baseDir . 'assets/mikio.js';
106*ab45ba71SJames Collins        $stylesheets[] = $this->baseDir . 'assets/mikio.less';
107*ab45ba71SJames Collins
108*ab45ba71SJames Collins        $set = [];
109c165b184SJames Collins        foreach ($stylesheets as $style) {
110*ab45ba71SJames Collins            if(in_array($style, $set) == FALSE) {
111*ab45ba71SJames Collins                if(strtolower(substr($style, -5)) == '.less') {
112*ab45ba71SJames Collins                    $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style);
113*ab45ba71SJames Collins                }
114*ab45ba71SJames Collins
115c165b184SJames Collins                array_unshift($event->data['link'], array(
116c165b184SJames Collins                    'type' => 'text/css',
117c165b184SJames Collins                    'rel'  => 'stylesheet',
118c165b184SJames Collins                    'href' => $style
119c165b184SJames Collins                ));
120c165b184SJames Collins            }
121*ab45ba71SJames Collins            $set[] = $style;
122*ab45ba71SJames Collins        }
123c165b184SJames Collins
124*ab45ba71SJames Collins        $set = [];
125c165b184SJames Collins        foreach ($scripts as $script) {
126*ab45ba71SJames Collins            if(in_array($script, $set) == FALSE) {
127c165b184SJames Collins                $event->data['script'][] = array(
128c165b184SJames Collins                    'type'  => 'text/javascript',
129c165b184SJames Collins                    '_data' => '',
130*ab45ba71SJames Collins                    'src'   => $script);
131*ab45ba71SJames Collins            }
132*ab45ba71SJames Collins            $set[] = $script;
133c165b184SJames Collins        }
134c165b184SJames Collins    }
135c165b184SJames Collins
136c165b184SJames Collins
137c165b184SJames Collins    /**
138c165b184SJames Collins     * DokuWiki content event handler
139c165b184SJames Collins     *
140c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
141c165b184SJames Collins     */
142*ab45ba71SJames Collins    /*public function contentHandler(\Doku_Event $event)
143c165b184SJames Collins    {
14475adba86SJames Collins        $event->data = $this->parseContent($event->data);
145*ab45ba71SJames Collins    }*/
146c165b184SJames Collins
147c165b184SJames Collins
148*ab45ba71SJames Collins    /** ----
149*ab45ba71SJames Collins     * Retreive and parse theme configuration options
150c165b184SJames Collins     *
151*ab45ba71SJames Collins     * @param   string  $key        the configuration key to retreive
152*ab45ba71SJames Collins     * @param   mixed   $default    if key doesn't exist, return this value
153*ab45ba71SJames Collins     * @return  mixed               parsed value of configuration
154c165b184SJames Collins     */
155*ab45ba71SJames Collins    public function getConf($key, $default = FALSE) {
156c165b184SJames Collins
157c165b184SJames Collins        $value = tpl_getConf($key, $default);
158c165b184SJames Collins
159*ab45ba71SJames Collins        // switch($key) {
160c165b184SJames Collins
161*ab45ba71SJames Collins        // }
162c165b184SJames Collins
163c165b184SJames Collins        return $value;
164c165b184SJames Collins    }
165c165b184SJames Collins
166c165b184SJames Collins
167c165b184SJames Collins    /**
168c165b184SJames Collins     * Icon
169c165b184SJames Collins     *
170c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
171c165b184SJames Collins     *
172c165b184SJames Collins     * @param   string  $type       The type of icon to return
173c165b184SJames Collins     * @return  string              HTML for icon element
174c165b184SJames Collins     */
175c165b184SJames Collins    public function icon($type) {
176c165b184SJames Collins        return '<i class="fa fa-' . $type . '" aria-hidden="true"></i>';
177c165b184SJames Collins    }
178c165b184SJames Collins
179c165b184SJames Collins
180c165b184SJames Collins
181c165b184SJames Collins
182c165b184SJames Collins     /**
183c165b184SJames Collins     * Add class to first DOM element
184c165b184SJames Collins     *
185c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
186c165b184SJames Collins     *
187c165b184SJames Collins     * @param   string  $content    HTML DOM
188c165b184SJames Collins     * @param   string  $class      Class to add DOM elements
189c165b184SJames Collins     * @return  string              HTML DOM with class added
190c165b184SJames Collins     */
191c165b184SJames Collins    public function elementAddClass($html, $class) {
192c165b184SJames Collins        preg_match('/class.*?".*?"/', $html, $matches);
193c165b184SJames Collins        if(count($matches) > 0) {
194c165b184SJames Collins            preg_match('/[" ]'.$class.'[" ]/', $matches[0], $matches);
195c165b184SJames Collins            if(count($matches) == 0) {
196c165b184SJames Collins                return preg_replace('/(class.*?=.*?")/', '${1}'.$class.' ', $html, 1);
197c165b184SJames Collins            }
198c165b184SJames Collins        } else {
199c165b184SJames Collins            return preg_replace('/>/', 'class="'.$class.'">', $html, 1);
200c165b184SJames Collins        }
201c165b184SJames Collins
202c165b184SJames Collins        return $html;
203c165b184SJames Collins    }
204c165b184SJames Collins
205c165b184SJames Collins
206*ab45ba71SJames Collins    public function includeFile($file, $print = true) {
207*ab45ba71SJames Collins        $html = '';
208*ab45ba71SJames Collins
209*ab45ba71SJames Collins        if(!$print) {
210*ab45ba71SJames Collins            ob_start();
211*ab45ba71SJames Collins        }
212*ab45ba71SJames Collins
213*ab45ba71SJames Collins        tpl_includeFile($file);
214*ab45ba71SJames Collins
215*ab45ba71SJames Collins        if(!$print) {
216*ab45ba71SJames Collins            $html = ob_get_contents();
217*ab45ba71SJames Collins            ob_end_clean();
218*ab45ba71SJames Collins        }
219*ab45ba71SJames Collins
220*ab45ba71SJames Collins        return $html;
221*ab45ba71SJames Collins    }
222*ab45ba71SJames Collins
223c165b184SJames Collins    /**
224*ab45ba71SJames Collins     * include page from namespace
2252b4583abSJames Collins     *
2262b4583abSJames Collins     * @author  James Collins <james.collins@outlook.com.au>
2272b4583abSJames Collins     *
228*ab45ba71SJames Collins     * @param   string  $page   namespace to include
229*ab45ba71SJames Collins     * @param   boolean $print  print content
230*ab45ba71SJames Collins     * @param   boolean $parse  parse content before printing/returning
231*ab45ba71SJames Collins     * @return  string          contents of page found
2322b4583abSJames Collins     */
233*ab45ba71SJames Collins    public function includePage($page, $print = TRUE, $parse = TRUE)
2342b4583abSJames Collins    {
235*ab45ba71SJames Collins        $useACL = TRUE; // TODO Add these as config options?
236*ab45ba71SJames Collins        $propagate = TRUE;
237*ab45ba71SJames Collins        $checkPropagate = TRUE; // TODO Add these as config options?
238*ab45ba71SJames Collins        $html = '';
2392b4583abSJames Collins
240*ab45ba71SJames Collins        $html = tpl_include_page($page, false, $propagate, $useACL);
241*ab45ba71SJames Collins        if($html == '' && $checkPropagate) {
242*ab45ba71SJames Collins            $html = tpl_include_page($page, false, false, $useACL);
243*ab45ba71SJames Collins        }
2442b4583abSJames Collins
245*ab45ba71SJames Collins        if($html != '' && $parse) {
246*ab45ba71SJames Collins            $html = $this->parseContent($html);
247*ab45ba71SJames Collins        }
2482b4583abSJames Collins
249*ab45ba71SJames Collins        if($print) echo $html;
2502b4583abSJames Collins
251*ab45ba71SJames Collins        return $html;
2522b4583abSJames Collins    }
2532b4583abSJames Collins
2542b4583abSJames Collins    public function includeLoggedIn() {
2552b4583abSJames Collins        if (!empty($_SERVER['REMOTE_USER'])) {
2562b4583abSJames Collins            echo '<li class="user navbar-text text-nowrap">';
2572b4583abSJames Collins            tpl_userinfo(); /* 'Logged in as ...' */
2582b4583abSJames Collins            echo '</li>';
2592b4583abSJames Collins        }
2602b4583abSJames Collins    }
2612b4583abSJames Collins
2622b4583abSJames Collins
263*ab45ba71SJames Collins    public function includeMenu($type, $print = true, $class = '') {
2642b4583abSJames Collins        global $lang;
2652b4583abSJames Collins        global $USERINFO;
266*ab45ba71SJames Collins        $html = '<ul class="mikio-nav ' . $class . '">';
267c165b184SJames Collins
268c165b184SJames Collins        switch($type) {
2692b4583abSJames Collins
270*ab45ba71SJames Collins            case 'none';
271*ab45ba71SJames Collins                return '';
2722b4583abSJames Collins
273*ab45ba71SJames Collins            case 'custom':
274*ab45ba71SJames Collins            case 'footer':
275*ab45ba71SJames Collins                $items = [];
2762b4583abSJames Collins
277*ab45ba71SJames Collins                if($type == 'footer') {
278*ab45ba71SJames Collins                    $items = explode(';', $this->getConf('footerCustomMenuText', ''));
279*ab45ba71SJames Collins                } else {
280*ab45ba71SJames Collins                    $items = explode(';', $this->getConf('navbarCustomMenuText', ''));
2812b4583abSJames Collins                }
282c165b184SJames Collins
283*ab45ba71SJames Collins                foreach($items as $item) {
284*ab45ba71SJames Collins                    $parts = explode('|', $item);
285*ab45ba71SJames Collins                    if($parts > 1) {
286*ab45ba71SJames Collins                        $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' . strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) . '</a></li>';
287*ab45ba71SJames Collins                    }
288c165b184SJames Collins                }
289c165b184SJames Collins
290*ab45ba71SJames Collins                break;
291c165b184SJames Collins
292*ab45ba71SJames Collins            case 'dokuwiki':
293*ab45ba71SJames Collins                $pageToolsMenu = [];
294*ab45ba71SJames Collins                $siteToolsMenu = [];
295*ab45ba71SJames Collins                $userToolsMenu = [];
296c165b184SJames Collins
297*ab45ba71SJames Collins                $showIcons  = ($this->getConf('navbarDWMenuType') != 'text');
298*ab45ba71SJames Collins                $showText   = ($this->getConf('navbarDWMenuType') != 'icons');
299*ab45ba71SJames Collins                $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate');
3002b4583abSJames Collins
3012b4583abSJames Collins                $items = (new \dokuwiki\Menu\PageMenu())->getItems();
3022b4583abSJames Collins                foreach($items as $item) {
303*ab45ba71SJames Collins                    if($item->getType() != 'top') {
304*ab45ba71SJames Collins                        $itemHtml = '';
3052b4583abSJames Collins
306*ab45ba71SJames Collins                        $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown ? 'mikio-dropdown-item' : '') . '" href="'.$item->getLink().'" title="'.$item->getTitle().'">';
307*ab45ba71SJames Collins                        if($showIcons) $itemHtml .= '<span class="mikio-icon">'.inlineSVG($item->getSvg()).'</span>';
308*ab45ba71SJames Collins                        if($showText || $isDropDown) $itemHtml .= '<span>' . $item->getLabel() . '</span>';
309*ab45ba71SJames Collins                        $itemHtml .= '</a>';
310*ab45ba71SJames Collins
311*ab45ba71SJames Collins                        $pageToolsMenu[] = $itemHtml;
3122b4583abSJames Collins                    }
3132b4583abSJames Collins                }
3142b4583abSJames Collins
315*ab45ba71SJames Collins                $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action ');
316*ab45ba71SJames Collins                foreach($items as $item) {
317*ab45ba71SJames Collins                    $itemHtml = '';
3182b4583abSJames Collins
319*ab45ba71SJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown ? 'mikio-dropdown-item' : '') . '" href="'.$item->getLink().'" title="'.$item->getTitle().'">';
320*ab45ba71SJames Collins                    if($showIcons) $itemHtml .= '<span class="mikio-icon">'.inlineSVG($item->getSvg()).'</span>';
321*ab45ba71SJames Collins                    if($showText || $isDropDown) $itemHtml .= '<span>' . $item->getLabel() . '</span>';
322*ab45ba71SJames Collins                    $itemHtml .= '</a>';
3232b4583abSJames Collins
324*ab45ba71SJames Collins                    $siteToolsMenu[] = $itemHtml;
3252b4583abSJames Collins                }
3262b4583abSJames Collins
327*ab45ba71SJames Collins                $items = (new \dokuwiki\Menu\UserMenu())->getItems('action');
328*ab45ba71SJames Collins                foreach($items as $item) {
329*ab45ba71SJames Collins                    $itemHtml = '';
330*ab45ba71SJames Collins
331*ab45ba71SJames Collins                    $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown ? 'mikio-dropdown-item' : '') . '" href="'.$item->getLink().'" title="'.$item->getTitle().'">';
332*ab45ba71SJames Collins                    if($showIcons) $itemHtml .= '<span class="mikio-icon">'.inlineSVG($item->getSvg()).'</span>';
333*ab45ba71SJames Collins                    if($showText || $isDropDown) $itemHtml .= '<span>' . $item->getLabel() . '</span>';
334*ab45ba71SJames Collins                    $itemHtml .= '</a>';
335*ab45ba71SJames Collins
336*ab45ba71SJames Collins                    $userToolsMenu[] = $itemHtml;
337*ab45ba71SJames Collins                }
338*ab45ba71SJames Collins
339*ab45ba71SJames Collins
340*ab45ba71SJames Collins                switch($this->getConf('navbarDWMenuCombine')) {
341*ab45ba71SJames Collins                    case 'dropdown':
342*ab45ba71SJames Collins                        $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">';
343*ab45ba71SJames Collins                        $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . ($showIcons ? $this->icon('file') : '') . ($showText ? $lang['page_tools'] : '') . '</a>';
344*ab45ba71SJames Collins                        $html .= '<div class="dropdown-menu dropdown-menu-right" aria-labelledby="mikio_dropdown_pagetools">';
345*ab45ba71SJames Collins
346*ab45ba71SJames Collins                        foreach($pageToolsMenu as $item) {
347*ab45ba71SJames Collins                            $html .= $item;
348*ab45ba71SJames Collins                        }
349*ab45ba71SJames Collins
350*ab45ba71SJames Collins                        $html .= '</div>';
351*ab45ba71SJames Collins                        $html .= '</li>';
352*ab45ba71SJames Collins
353*ab45ba71SJames Collins                        $html .= '<li id="dokuwiki__sitetools" class="nav-item dropdown mikio-navbar-dropdown">';
354*ab45ba71SJames Collins                        $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . ($showIcons ? $this->icon('gear') : '') . ($showText ? $lang['site_tools'] : '') . '</a>';
355*ab45ba71SJames Collins                        $html .= '<div class="dropdown-menu dropdown-menu-right">';
356*ab45ba71SJames Collins
357*ab45ba71SJames Collins                        foreach($siteToolsMenu as $item) {
358*ab45ba71SJames Collins                            $html .= $item;
359*ab45ba71SJames Collins                        }
360*ab45ba71SJames Collins
361*ab45ba71SJames Collins                        $html .= '</div>';
362*ab45ba71SJames Collins                        $html .= '</li>';
363*ab45ba71SJames Collins
364*ab45ba71SJames Collins                        $html .= '<li id="dokuwiki__usertools" class="nav-item dropdown mikio-navbar-dropdown">';
365*ab45ba71SJames Collins                        $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . ($showIcons ? $this->icon('user') : '') . ($showText ? $lang['user_tools'] : '') . '</a>';
366*ab45ba71SJames Collins                        $html .= '<div class="dropdown-menu dropdown-menu-right">';
367*ab45ba71SJames Collins
368*ab45ba71SJames Collins                        foreach($userToolsMenu as $item) {
369*ab45ba71SJames Collins                            $html .= $item;
370*ab45ba71SJames Collins                        }
371*ab45ba71SJames Collins
372*ab45ba71SJames Collins                        $html .= '</div>';
373*ab45ba71SJames Collins                        $html .= '</li>';
374*ab45ba71SJames Collins
375*ab45ba71SJames Collins                        break;
376*ab45ba71SJames Collins
377*ab45ba71SJames Collins                    case 'combine':
378*ab45ba71SJames Collins                        $html .= '<li class="mikio-nav-dropdown">';
379*ab45ba71SJames Collins                        $html .= '<a class="mikio-nav-link" href="#">' . ($showIcons ? $this->icon('wrench') : '') . '' . '</a>';   // TODO change $lang
380*ab45ba71SJames Collins                        $html .= '<div class="mikio-dropdown">';
381*ab45ba71SJames Collins
382*ab45ba71SJames Collins                        $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>';
383*ab45ba71SJames Collins                        foreach($pageToolsMenu as $item) {
384*ab45ba71SJames Collins                            $html .= $item;
385*ab45ba71SJames Collins                        }
386*ab45ba71SJames Collins
387*ab45ba71SJames Collins                        $html .= '<div class="mikio-dropdown-divider"></div>';
388*ab45ba71SJames Collins                        $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>';
389*ab45ba71SJames Collins                        foreach($siteToolsMenu as $item) {
390*ab45ba71SJames Collins                            $html .= $item;
391*ab45ba71SJames Collins                        }
392*ab45ba71SJames Collins
393*ab45ba71SJames Collins                        $html .= '<div class="mikio-dropdown-divider"></div>';
394*ab45ba71SJames Collins                        $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>';
395*ab45ba71SJames Collins                        foreach($userToolsMenu as $item) {
396*ab45ba71SJames Collins                            $html .= $item;
397*ab45ba71SJames Collins                        }
398*ab45ba71SJames Collins
399*ab45ba71SJames Collins                        $html .= '</div>';
400*ab45ba71SJames Collins                        $html .= '</li>';
401*ab45ba71SJames Collins                        break;
402*ab45ba71SJames Collins
403*ab45ba71SJames Collins                    default:    // seperate
404*ab45ba71SJames Collins                        foreach($userToolsMenu as $item) {
405*ab45ba71SJames Collins                            $html .= '<li class="nav-item mikio-navbar-seperate">' . $item . '<li>';
406*ab45ba71SJames Collins                        }
407*ab45ba71SJames Collins
408*ab45ba71SJames Collins                        foreach($siteToolsMenu as $item) {
409*ab45ba71SJames Collins                            $html .= '<li class="nav-item mikio-navbar-seperate">' . $item . '<li>';
410*ab45ba71SJames Collins                        }
411*ab45ba71SJames Collins
412*ab45ba71SJames Collins                        foreach($pageToolsMenu as $item) {
413*ab45ba71SJames Collins                            $html .= '<li class="nav-item mikio-navbar-seperate">' . $item . '<li>';
414*ab45ba71SJames Collins                        }
415*ab45ba71SJames Collins
416*ab45ba71SJames Collins                        break;
417*ab45ba71SJames Collins                }
418*ab45ba71SJames Collins
419*ab45ba71SJames Collins
420*ab45ba71SJames Collins                break;
421*ab45ba71SJames Collins
422*ab45ba71SJames Collins        }
423*ab45ba71SJames Collins
424*ab45ba71SJames Collins        $html .= '</ul>';
425*ab45ba71SJames Collins
4262b4583abSJames Collins        if($print) {
427*ab45ba71SJames Collins            echo $html;
4282b4583abSJames Collins            return '';
4292b4583abSJames Collins        }
4302b4583abSJames Collins
431*ab45ba71SJames Collins        return $html;
4322b4583abSJames Collins    }
4332b4583abSJames Collins
4342b4583abSJames Collins
435*ab45ba71SJames Collins    /** ----
436*ab45ba71SJames Collins     * print or return the main navbar
4372b4583abSJames Collins     *
438*ab45ba71SJames Collins     * @param boolean   $print      print the
4392b4583abSJames Collins     *
440*ab45ba71SJames Collins     * @return string               generated content
4412b4583abSJames Collins     */
442*ab45ba71SJames Collins    public function includeNavbar($print = TRUE) {
44347161538SJames Collins        global $conf;
444*ab45ba71SJames Collins        $html = '';
445*ab45ba71SJames Collins        $class = '';
44647161538SJames Collins
447*ab45ba71SJames Collins        $html .= '<nav class="mikio-navbar">';
448*ab45ba71SJames Collins        $html .= '<a class="mikio-navbar-brand" href="' . wl() . '">';
449*ab45ba71SJames Collins        if($this->getConf('navbarUseTitleIcon') || $this->getConf('navbarUseTitleText')) {
450*ab45ba71SJames Collins
451*ab45ba71SJames Collins            // Brand image
452*ab45ba71SJames Collins            if($this->getConf('navbarUseTitleIcon')) {
453*ab45ba71SJames Collins                $logo = tpl_getMediaFile(array(':wiki:logo.png', ':logo.png', 'images/logo.png', 'images/logo.jpg', 'images/logo.gif'), false);
454*ab45ba71SJames Collins                if($logo != '') {
455*ab45ba71SJames Collins                    $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image">';
456*ab45ba71SJames Collins                }
457*ab45ba71SJames Collins            }
458*ab45ba71SJames Collins
459*ab45ba71SJames Collins            // Brand title
460*ab45ba71SJames Collins            if($this->getConf('navbarUseTitleText')) {
461*ab45ba71SJames Collins                $html .= '<div class="mikio-navbar-brand-title">';
462*ab45ba71SJames Collins                    $html .= '<div class="mikio-navbar-brand-title-text">' . $conf['title'] . '</div>';
463*ab45ba71SJames Collins                    if($this->getConf('navbarUseTaglineText')) {
464*ab45ba71SJames Collins                        $html .= '<div class="mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</div>';
465*ab45ba71SJames Collins                    }
466*ab45ba71SJames Collins                $html .= '</div>';
467*ab45ba71SJames Collins            }
468*ab45ba71SJames Collins        }
469*ab45ba71SJames Collins        $html .= '</a>';
470*ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-toggle"><svg viewBox="0 0 32 32" preserveAspectRatio="xMidYMin" aria-hidden="true"><path d="M6.001 7.128L6 10.438l19.998-.005L26 7.124zM6.001 21.566L6 24.876l19.998-.006.002-3.308zM6.001 14.341L6 17.65l19.998-.004.002-3.309z"></path></svg></div>';
471*ab45ba71SJames Collins        // $html .= '</div>';
472*ab45ba71SJames Collins
473*ab45ba71SJames Collins        // Menus
474*ab45ba71SJames Collins        $html .= '<div class="mikio-navbar-collapse">';
475*ab45ba71SJames Collins
476*ab45ba71SJames Collins            $html .= '<div class="mikio-nav-item">';
477*ab45ba71SJames Collins            $html .= $this->includeSearch(false);
478*ab45ba71SJames Collins            $html .= '</div>';
479*ab45ba71SJames Collins
480*ab45ba71SJames Collins            $html .= '<div class="mikio-nav-item">';
481*ab45ba71SJames Collins            $menu = $this->getConf('navbarPosRightRight');
482*ab45ba71SJames Collins            $html .= $this->includeMenu($menu, false);
483*ab45ba71SJames Collins            $html .= '</div>';
484*ab45ba71SJames Collins
485*ab45ba71SJames Collins        $html .= '</div>';
486*ab45ba71SJames Collins
487*ab45ba71SJames Collins        $html .= '</nav>';
488*ab45ba71SJames Collins
489*ab45ba71SJames Collins        // Seperate Menubar
490*ab45ba71SJames Collins        if($this->getConf('navbarLowerMenu') != 'none') {
491*ab45ba71SJames Collins            $class = $this->getConf('navbarLowerBackground');
492*ab45ba71SJames Collins            if($class == 'none') {
493*ab45ba71SJames Collins                $class = '';
494*ab45ba71SJames Collins            } else {
495*ab45ba71SJames Collins                $class = 'navbar-' . $class;
496*ab45ba71SJames Collins            }
497*ab45ba71SJames Collins
498*ab45ba71SJames Collins            $pos = $this->getConf('navbarLowerMenuPos');
499*ab45ba71SJames Collins            if($pos == 'right') {
500*ab45ba71SJames Collins                $class .= ' justify-content-end';
501*ab45ba71SJames Collins            } else if($pos == 'center') {
502*ab45ba71SJames Collins                $class .= ' justify-content-center';
503*ab45ba71SJames Collins            }
504*ab45ba71SJames Collins
505*ab45ba71SJames Collins            $html .= '<nav class="mikio-lower-navbar navbar navbar-expand flex-column flex-md-row ' . $class . '">';
506*ab45ba71SJames Collins
507*ab45ba71SJames Collins            $menu = $this->getConf('navbarLowerMenu');
508*ab45ba71SJames Collins            if($menu != 'none' && $menu != 'search') {
509*ab45ba71SJames Collins                $html .= '<div class="mikio-nav-item navbar-nav-scroll">';
510*ab45ba71SJames Collins                $html .= $this->includeMenu($menu, false);
511*ab45ba71SJames Collins                $html .= '</div>';
512*ab45ba71SJames Collins                $class = '';
513*ab45ba71SJames Collins            } else if($menu == 'search') {
514*ab45ba71SJames Collins                $html .= '<div class="mikio-nav-item">';
515*ab45ba71SJames Collins                $html .= $this->includeSearch(false);
516*ab45ba71SJames Collins                $html .= '</div>';
517*ab45ba71SJames Collins                $class = '';
518*ab45ba71SJames Collins            }
519*ab45ba71SJames Collins
520*ab45ba71SJames Collins            $html .= '</nav>';
521*ab45ba71SJames Collins        }
522*ab45ba71SJames Collins
523*ab45ba71SJames Collins        if($print) {
524*ab45ba71SJames Collins            echo $html;
525*ab45ba71SJames Collins            return '';
526*ab45ba71SJames Collins        }
527*ab45ba71SJames Collins
528*ab45ba71SJames Collins        return $html;
529*ab45ba71SJames Collins    }
530*ab45ba71SJames Collins
531*ab45ba71SJames Collins
532*ab45ba71SJames Collins    /** ----
533*ab45ba71SJames Collins     * Print or return the sidebar content
534*ab45ba71SJames Collins     *
535*ab45ba71SJames Collins     * @param   string  $prefix     sidebar prefix to use when searching
536*ab45ba71SJames Collins     * @param   boolean $print      print the generated content to the output buffer
537*ab45ba71SJames Collins     * @param   boolean $parse      parse the content
538*ab45ba71SJames Collins     *
539*ab45ba71SJames Collins     * @return  string              generated content
540*ab45ba71SJames Collins     */
541*ab45ba71SJames Collins    public function includeSidebar($prefix = '', $print = TRUE, $parse = TRUE) {
542*ab45ba71SJames Collins        global $conf, $ID;
543*ab45ba71SJames Collins
544*ab45ba71SJames Collins        $html = '';
545*ab45ba71SJames Collins        $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix));
546*ab45ba71SJames Collins        $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix));
547*ab45ba71SJames Collins
548*ab45ba71SJames Collins        if($confPrefix == '') $confPrefix = 'Left';
549*ab45ba71SJames Collins        if($prefix == 'Left') $prefix = '';
550*ab45ba71SJames Collins
551*ab45ba71SJames Collins        if($this->getConf('sidebarShow' . $confPrefix) && page_findnearest($conf[$prefix . 'sidebar']) != FALSE && p_get_metadata($ID, 'nosidebar', FALSE) == FALSE) {
552*ab45ba71SJames Collins
553*ab45ba71SJames Collins            $content = $this->includeFile('sidebar' . $prefix . 'header.html', FALSE);
554*ab45ba71SJames Collins            if($content != '') $html .= '<div class="mikio-sidebar-header">' . $content . '</div>';
555*ab45ba71SJames Collins
556*ab45ba71SJames Collins            if($prefix == '' && $this->getConf('sidebarLeftSearch') == 'top') $html .= $this->includeSearch(FALSE);
557*ab45ba71SJames Collins
558*ab45ba71SJames Collins            $content = $this->includePage($conf[$prefix . 'sidebar'], FALSE);
559*ab45ba71SJames Collins            if($content != '') $html .= '<div class="mikio-sidebar-content">' . $content . '</div>';
560*ab45ba71SJames Collins
561*ab45ba71SJames Collins            if($prefix == '' && $this->getConf('sidebarLeftSearch') == 'bottom') $html .= $this->includeSearch(FALSE);
562*ab45ba71SJames Collins
563*ab45ba71SJames Collins            $content = $this->includeFile('sidebar' . $prefix . 'footer.html', FALSE);
564*ab45ba71SJames Collins            if($content != '') $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>';
565*ab45ba71SJames Collins        }
566*ab45ba71SJames Collins
567*ab45ba71SJames Collins        if($html != '') {
568*ab45ba71SJames Collins            $html = '<aside class="mikio-sidebar mikio-sidebar-' . ($prefix == '' ? 'left' : $prefix) . '"><a class="mikio-sidebar-toggle" href="#">' . tpl_getLang('sidebar-title') . '</a><div class="mikio-sidebar-collapse">'. $html . '</div></aside>';
569*ab45ba71SJames Collins        }
570*ab45ba71SJames Collins
571*ab45ba71SJames Collins        if($parse) $html = $this->includeIcons($html);
572*ab45ba71SJames Collins        if($print) echo $html;
573*ab45ba71SJames Collins        return $html;
574*ab45ba71SJames Collins    }
575*ab45ba71SJames Collins
576*ab45ba71SJames Collins
577*ab45ba71SJames Collins    /** ----
578*ab45ba71SJames Collins     * Print or return the page tools content
579*ab45ba71SJames Collins     *
580*ab45ba71SJames Collins     * @param   boolean $print      print the generated content to the output buffer
581*ab45ba71SJames Collins     * @param   boolean $includeId  include the dw__pagetools id in the element
582*ab45ba71SJames Collins     *
583*ab45ba71SJames Collins     * @return  string              generated content
584*ab45ba71SJames Collins     */
585*ab45ba71SJames Collins    public function includePageTools($print = TRUE, $includeId = FALSE) {
586*ab45ba71SJames Collins        $html = '';
587*ab45ba71SJames Collins
588*ab45ba71SJames Collins        $html .= '<nav' . ($includeId ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">';
589*ab45ba71SJames Collins
590*ab45ba71SJames Collins        $items = (new \dokuwiki\Menu\PageMenu())->getItems();
591*ab45ba71SJames Collins        foreach($items as $item) {
592*ab45ba71SJames Collins            $html .= '<a href="'.$item->getLink().'" title="'.$item->getTitle().'"><span class="icon">'.inlineSVG($item->getSvg()).'</span><span class="a11y">'.$item->getLabel().'</span></a>';
593*ab45ba71SJames Collins        }
594*ab45ba71SJames Collins
595*ab45ba71SJames Collins        $html .= '</nav>';
596*ab45ba71SJames Collins
597*ab45ba71SJames Collins        if($print) echo $html;
598*ab45ba71SJames Collins        return $html;
599*ab45ba71SJames Collins    }
600*ab45ba71SJames Collins
601*ab45ba71SJames Collins
602*ab45ba71SJames Collins    public function includeSearch($print = TRUE, $class = '') {
603*ab45ba71SJames Collins        global $lang;
604*ab45ba71SJames Collins        $html = '';
605*ab45ba71SJames Collins
606*ab45ba71SJames Collins        // $html .= '<div class="mikio-search">';
607*ab45ba71SJames Collins        $html .= '<form class="mikio-search" action="' . wl($ID) . '" accept-charset="utf-8" method="get" role="search">';
608*ab45ba71SJames Collins            $html .= '<input class="mikio-control" autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' . (($ACT == 'search') ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />';
609*ab45ba71SJames Collins                $html .= '<button class="mikio-control" type="submit" title="' .  $lang['btn_search'] . '">';
610*ab45ba71SJames Collins                    if($this->getConf('searchButton') == 'icon') {
611*ab45ba71SJames Collins                        $html .= $this->icon('search');
612*ab45ba71SJames Collins                    } else {
613*ab45ba71SJames Collins                        $html .= $lang['btn_search'];
614*ab45ba71SJames Collins                    }
615*ab45ba71SJames Collins                $html .= '</button>';
616*ab45ba71SJames Collins        $html .= '</form>';
617*ab45ba71SJames Collins        // $html .= '</div>';
618*ab45ba71SJames Collins
619*ab45ba71SJames Collins        // $html .= '<div class="mikio-search ' . $class . '">';
620*ab45ba71SJames Collins        // $html .= '<form action="' . wl($ID) . '" accept-charset="utf-8" class="form-inline search" method="get" role="search">';
621*ab45ba71SJames Collins        //     $html .= '<div class="input-group"><input id="sqsearch" autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' . (($ACT == 'search') ? htmlspecialchars($QUERY) : '') . '" accesskey="f" name="q" class="form-control" title="[F]" />';
622*ab45ba71SJames Collins        //         $html .= '<div class="input-group-append"><button class="btn btn-secondary" type="submit" title="' .  $lang['btn_search'] . '">';
623*ab45ba71SJames Collins        //             if($this->getConf('searchButton') == 'icon') {
624*ab45ba71SJames Collins        //                 $html .= $this->icon('search');
625*ab45ba71SJames Collins        //             } else {
626*ab45ba71SJames Collins        //                 $html .= $lang['btn_search'];
627*ab45ba71SJames Collins        //             }
628*ab45ba71SJames Collins        //         $html .= '</button></div></div>';
629*ab45ba71SJames Collins        //         $html .= '<input type="hidden" name="do" value="search" />';
630*ab45ba71SJames Collins        // $html .= '</form>';
631*ab45ba71SJames Collins        // $html .= '</div>';
632*ab45ba71SJames Collins
633*ab45ba71SJames Collins        if($print) {
634*ab45ba71SJames Collins            print $html;
635*ab45ba71SJames Collins            return '';
636*ab45ba71SJames Collins        }
637*ab45ba71SJames Collins
638*ab45ba71SJames Collins        return $html;
639*ab45ba71SJames Collins    }
640*ab45ba71SJames Collins
641*ab45ba71SJames Collins
642*ab45ba71SJames Collins    public function includeContent($print = FALSE) {
643*ab45ba71SJames Collins        ob_start();
644*ab45ba71SJames Collins        tpl_content(false);
645*ab45ba71SJames Collins        $html = ob_get_contents();
646*ab45ba71SJames Collins        ob_end_clean();
647*ab45ba71SJames Collins
648*ab45ba71SJames Collins        $html = $this->includeIcons($html);
649*ab45ba71SJames Collins        $html = $this->parseContent($html);
650*ab45ba71SJames Collins
651*ab45ba71SJames Collins        $html .= '<div style="clear:both"></div>';
652*ab45ba71SJames Collins
653*ab45ba71SJames Collins        if($print) echo $html;
654*ab45ba71SJames Collins        return $html;
655*ab45ba71SJames Collins    }
656*ab45ba71SJames Collins
657*ab45ba71SJames Collins    /** ----
658*ab45ba71SJames Collins     * Print or return footer
659*ab45ba71SJames Collins     *
660*ab45ba71SJames Collins     * @param   boolean  $print     print footer
661*ab45ba71SJames Collins     * @return  string              html string containing footer
662*ab45ba71SJames Collins     */
663*ab45ba71SJames Collins    public function includeFooter($print = TRUE) {
664*ab45ba71SJames Collins        global $ACT;
665*ab45ba71SJames Collins
666*ab45ba71SJames Collins        $html = '';
667*ab45ba71SJames Collins
668*ab45ba71SJames Collins        $html .= '<footer class="mikio-footer">';
669*ab45ba71SJames Collins        $html .= '<div class="doc">' . tpl_pageinfo(TRUE) . '</div>';
670*ab45ba71SJames Collins        $html .= $this->includeFile(TRUE);
671*ab45ba71SJames Collins        if($ACT == 'show') {
672*ab45ba71SJames Collins            $this->includePage('footer');
673*ab45ba71SJames Collins        }
674*ab45ba71SJames Collins
675*ab45ba71SJames Collins        if($this->getConf('footerCustomMenuText') != '') {
676*ab45ba71SJames Collins            $html .= $this->includeMenu('footer', FALSE);
677*ab45ba71SJames Collins        }
678*ab45ba71SJames Collins
679*ab45ba71SJames Collins        if($this->getConf('footerSearch')) {
680*ab45ba71SJames Collins            $html .= '<div class="mikio-footer-search">';
681*ab45ba71SJames Collins            $html .= $this->includeSearch(FALSE);
682*ab45ba71SJames Collins            $html .= '</div>';
683*ab45ba71SJames Collins        }
684*ab45ba71SJames Collins
685*ab45ba71SJames Collins        if($this->getConf('pageToolsFooter') != '' && $ACT == 'show') {
686*ab45ba71SJames Collins            $html .= $this->includePageTools(FALSE);
687*ab45ba71SJames Collins        }
688*ab45ba71SJames Collins
689*ab45ba71SJames Collins        $meta['licenseType']            = array('multichoice', '_choices' => array('none', 'badge', 'button'));
690*ab45ba71SJames Collins        $meta['licenseImageOnly']       = array('onoff');
691*ab45ba71SJames Collins
692*ab45ba71SJames Collins        $licenseType = $this->getConf('licenseType');
693*ab45ba71SJames Collins        if($licenseType != 'none') {
694*ab45ba71SJames Collins            $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), TRUE, TRUE);
695*ab45ba71SJames Collins        }
696*ab45ba71SJames Collins
697*ab45ba71SJames Collins        $html .= '</footer>';
698*ab45ba71SJames Collins
699*ab45ba71SJames Collins        if($print) echo $html;
700*ab45ba71SJames Collins        return $html;
701*ab45ba71SJames Collins    }
702*ab45ba71SJames Collins
703*ab45ba71SJames Collins
704*ab45ba71SJames Collins    /** ----
705*ab45ba71SJames Collins     * Print or return breadcrumb trail
706*ab45ba71SJames Collins     *
707*ab45ba71SJames Collins     * @param   boolean  $print     print out trail
708*ab45ba71SJames Collins     * @param   boolean  $parse     parse trail before printing
709*ab45ba71SJames Collins     * @return  string              html string containing breadcrumbs
710*ab45ba71SJames Collins     */
711*ab45ba71SJames Collins    public function includeBreadcrumbs($print = TRUE, $parse = TRUE) {
712*ab45ba71SJames Collins        global $conf, $ID, $lang;
713*ab45ba71SJames Collins
714*ab45ba71SJames Collins        $html = '<div class="mikio-breadcrumbs">';
71575adba86SJames Collins
71647161538SJames Collins        if($conf['breadcrumbs']) {
717*ab45ba71SJames Collins            if(!$this->getConf('breadcrumbPrefix') && !$this->getConf('breadcrumbSep')) {
718*ab45ba71SJames Collins                ob_start();
71975adba86SJames Collins                tpl_breadcrumbs();
720*ab45ba71SJames Collins                $html .= ob_get_contents();
721*ab45ba71SJames Collins                ob_end_clean();
722*ab45ba71SJames Collins            } else {
723*ab45ba71SJames Collins                $sep = '•';
724*ab45ba71SJames Collins                $prefix = $lang['breadcrumb'];
725*ab45ba71SJames Collins
726*ab45ba71SJames Collins                if($this->getConf('breadcrumbSep')) {
727*ab45ba71SJames Collins                    $sep = $this->getConf('breadcrumbSepText');
728*ab45ba71SJames Collins                    $img = $this->getMediaFile('breadcrumb-sep');
729*ab45ba71SJames Collins
730*ab45ba71SJames Collins                    if($img !== FALSE) {
731*ab45ba71SJames Collins                        $sep = '<img src="' . $img . '">';
732*ab45ba71SJames Collins                    }
73347161538SJames Collins                }
73447161538SJames Collins
735*ab45ba71SJames Collins                if($this->getConf('breadcrumbPrefix')) {
736*ab45ba71SJames Collins                    $prefix = $this->getConf('breadcrumbPrefixText');
737*ab45ba71SJames Collins                    $img = $this->getMediaFile('breadcrumb-prefix');
738*ab45ba71SJames Collins
739*ab45ba71SJames Collins                    if($img !== FALSE) {
740*ab45ba71SJames Collins                        $prefix = '<img src="' . $img . '">';
741*ab45ba71SJames Collins                    }
742*ab45ba71SJames Collins                }
743*ab45ba71SJames Collins
744*ab45ba71SJames Collins                $crumbs = breadcrumbs();
745*ab45ba71SJames Collins
746*ab45ba71SJames Collins                $html .= '<ul>';
747*ab45ba71SJames Collins                if($prefix != '') $html .= '<li class="prefix">' . $prefix . '</li>';
748*ab45ba71SJames Collins
749*ab45ba71SJames Collins                $last = count($crumbs);
750*ab45ba71SJames Collins                $i    = 0;
751*ab45ba71SJames Collins                foreach($crumbs as $id => $name) {
752*ab45ba71SJames Collins                    $i++;
753*ab45ba71SJames Collins                    $html .= '<li class="sep">' . $sep . '</li>';
754*ab45ba71SJames Collins                    $html .= '<li' . ($i == $last ? ' class="curid"' : '') . '>';
755*ab45ba71SJames Collins                    $html .= tpl_pagelink($id, NULL, TRUE);
756*ab45ba71SJames Collins                    $html .= '</li>';
757*ab45ba71SJames Collins                }
758*ab45ba71SJames Collins
759*ab45ba71SJames Collins                $html .= '</ul>';
760*ab45ba71SJames Collins            }
761*ab45ba71SJames Collins        } else if($conf['youarehere']) {
762*ab45ba71SJames Collins            if(!$this->getConf('breadcrumbPrefix') && !$this->getConf('breadcrumbSep')) {
763*ab45ba71SJames Collins                ob_start();
76475adba86SJames Collins                tpl_youarehere();
765*ab45ba71SJames Collins                $html .= ob_get_contents();
766*ab45ba71SJames Collins                ob_end_clean();
767*ab45ba71SJames Collins            } else {
768*ab45ba71SJames Collins                $sep = ' » ';
769*ab45ba71SJames Collins                $prefix = $lang['youarehere'];
770*ab45ba71SJames Collins
771*ab45ba71SJames Collins                if($this->getConf('breadcrumbSep')) {
772*ab45ba71SJames Collins                    $sep = $this->getConf('breadcrumbSepText');
773*ab45ba71SJames Collins                    $img = $this->getMediaFile('breadcrumb-sep');
774*ab45ba71SJames Collins
775*ab45ba71SJames Collins                    if($img !== FALSE) {
776*ab45ba71SJames Collins                        $sep = '<img src="' . $img . '">';
777*ab45ba71SJames Collins                    }
77875adba86SJames Collins                }
77975adba86SJames Collins
780*ab45ba71SJames Collins                if($this->getConf('breadcrumbPrefix')) {
781*ab45ba71SJames Collins                    $prefix = $this->getConf('breadcrumbPrefixText');
782*ab45ba71SJames Collins                    $img = $this->getMediaFile('breadcrumb-prefix');
783*ab45ba71SJames Collins
784*ab45ba71SJames Collins                    if($img !== FALSE) {
785*ab45ba71SJames Collins                        $prefix = '<img src="' . $img . '">';
78675adba86SJames Collins                    }
78747161538SJames Collins                }
78847161538SJames Collins
789*ab45ba71SJames Collins                $html .= '<ul>';
790*ab45ba71SJames Collins                if($prefix != '') $html .= '<li class="prefix">' . $prefix . '</li>';
791*ab45ba71SJames Collins                $html .= '<li>' . tpl_pagelink(':'.$conf['start'], NULL, TRUE) . '</li>';
792*ab45ba71SJames Collins
793*ab45ba71SJames Collins                $parts = explode(':', $ID);
794*ab45ba71SJames Collins                $count = count($parts);
795*ab45ba71SJames Collins
796*ab45ba71SJames Collins                $part = '';
797*ab45ba71SJames Collins                for($i = 0; $i < $count - 1; $i++) {
798*ab45ba71SJames Collins                    $part .= $parts[$i].':';
799*ab45ba71SJames Collins                    $page = $part;
800*ab45ba71SJames Collins                    if($page == $conf['start']) continue;
801*ab45ba71SJames Collins
802*ab45ba71SJames Collins                    $html .= '<li class="sep">' . $sep . '</li>';
803*ab45ba71SJames Collins                    $html .= '<li>' . tpl_pagelink($page, NULL, TRUE) . '</li>';
804*ab45ba71SJames Collins                }
805*ab45ba71SJames Collins
806*ab45ba71SJames Collins                resolve_pageid('', $page, $exists);
807*ab45ba71SJames Collins                if(!(isset($page) && $page == $part.$parts[$i])) {
808*ab45ba71SJames Collins                    $page = $part.$parts[$i];
809*ab45ba71SJames Collins                    if($page != $conf['start']) {
810*ab45ba71SJames Collins                        $html .= '<li class="sep">' . $sep . '</li>';
811*ab45ba71SJames Collins                        $html .= '<li>' . tpl_pagelink($page, NULL, TRUE) . '</li>';
812*ab45ba71SJames Collins                    }
813*ab45ba71SJames Collins                }
814*ab45ba71SJames Collins
815*ab45ba71SJames Collins                $html .= '</ul>';
816*ab45ba71SJames Collins            }
817*ab45ba71SJames Collins        }
818*ab45ba71SJames Collins
819*ab45ba71SJames Collins        $html .= '</div>';
820*ab45ba71SJames Collins
821*ab45ba71SJames Collins        if($parse) $html = $this->includeIcons($html);
822*ab45ba71SJames Collins        if($print) echo $html;
823*ab45ba71SJames Collins        return $html;
824*ab45ba71SJames Collins    }
825*ab45ba71SJames Collins
826*ab45ba71SJames Collins
82747161538SJames Collins
82875adba86SJames Collins    /**
82975adba86SJames Collins     * Print out hero
83075adba86SJames Collins     *
83175adba86SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
83275adba86SJames Collins     */
83375adba86SJames Collins    public function includeHero() {
83475adba86SJames Collins        global $ACT;
8352b4583abSJames Collins        global $INFO;
83647161538SJames Collins
8372b4583abSJames Collins        // file_put_contents('output.txt', print_r($INFO, true));
8382b4583abSJames Collins
8392b4583abSJames Collins        if($ACT == 'show') {
840*ab45ba71SJames Collins            if($this->getConf('heroTitle')) {
84175adba86SJames Collins                print '<div class="mikio-hero d-flex flex-row">';
84275adba86SJames Collins                    print '<div class="mikio-hero-text flex-grow-1">';
843*ab45ba71SJames Collins                        if ($ACT == 'show' && $this->getConf('breadcrumbPos') == 'hero') print $this->includeBreadcrumbs();
844*ab45ba71SJames Collins
84575adba86SJames Collins                        print '<h1 id="mikio-hero-title">';
8462b4583abSJames Collins                            print tpl_pagetitle(null, true).' ';    // No idea why this requires a blank space afterwards to work?
84775adba86SJames Collins                        print '</h1>';
8482b4583abSJames Collins                        print '<h2 class="mikio-hero-subtext">';
8492b4583abSJames Collins                            // print $this->heroSubtitle;       // TODO scrape page for hero subtitle
85075adba86SJames Collins                        print '</h2>';
85175adba86SJames Collins                    print '</div>';
85247161538SJames Collins
8532b4583abSJames Collins
8542b4583abSJames Collins                    $hero_image = tpl_getMediaFile(array(':' . $INFO['namespace'] . ':hero.png', ':' . $INFO['namespace'] . ':hero.jpg', ':hero.png', ':hero.jpg', ':wiki:hero.png', ':wiki:hero.jpg', 'images/hero.png', 'images/hero.jpg'), false);
85575adba86SJames Collins                    if($hero_image != '') $hero_image = ' style="background-image:url(\''.$hero_image.'\');"';
85647161538SJames Collins
85775adba86SJames Collins                    print '<div class="mikio-hero-image"' . $hero_image . '></div>';
85875adba86SJames Collins                print '</div>';
85947161538SJames Collins            }
86075adba86SJames Collins        }
86175adba86SJames Collins    }
86275adba86SJames Collins
86375adba86SJames Collins
86475adba86SJames Collins    /**
86575adba86SJames Collins     * Print out TOC
86675adba86SJames Collins     *
867*ab45ba71SJames Collins     * @param   boolean
868*ab45ba71SJames Collins     *
86975adba86SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
87075adba86SJames Collins     */
871*ab45ba71SJames Collins    public function includeTOC($parse = TRUE) {
872*ab45ba71SJames Collins        $html = '';
8732b4583abSJames Collins
874*ab45ba71SJames Collins        $tocHtml = tpl_toc(true);
875*ab45ba71SJames Collins
876*ab45ba71SJames Collins        if($tocHtml != '') {
877*ab45ba71SJames Collins            $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml);
878*ab45ba71SJames Collins
879*ab45ba71SJames Collins            $html .= '<div class="mikio-toc">';
880*ab45ba71SJames Collins            $html .= $tocHtml;
881*ab45ba71SJames Collins            $html .= '</div>';
8822b4583abSJames Collins        }
8832b4583abSJames Collins
884*ab45ba71SJames Collins        if($parse) $html = $this->includeIcons($html);
885*ab45ba71SJames Collins        echo $html;
886*ab45ba71SJames Collins    }
887*ab45ba71SJames Collins
888*ab45ba71SJames Collins
889*ab45ba71SJames Collins    /** ----
890*ab45ba71SJames Collins     * Parse the string and replace icon elements with included icon libraries
891*ab45ba71SJames Collins     *
892*ab45ba71SJames Collins     * @param   string  $str        content to parse
893*ab45ba71SJames Collins     * @return  string              parsed string
894*ab45ba71SJames Collins     */
895*ab45ba71SJames Collins    public function includeIcons($str) {
896*ab45ba71SJames Collins        global $ACT, $MIKIO_ICONS;
897*ab45ba71SJames Collins
898*ab45ba71SJames Collins        $iconTag = $this->getConf('iconTag', 'icon');
899*ab45ba71SJames Collins
900*ab45ba71SJames Collins        if($ACT == 'show' || $ACT == 'admin' && count($MIKIO_ICONS) > 0) {
901*ab45ba71SJames Collins            $str = preg_replace_callback('/&lt;' . $iconTag . ' ([\w\- #]*)&gt;(?=[^>]*(<|$))/',
902*ab45ba71SJames Collins                function ($matches) {
903*ab45ba71SJames Collins                    global $MIKIO_ICONS;
904*ab45ba71SJames Collins
905*ab45ba71SJames Collins                    $s = $matches[0];
906*ab45ba71SJames Collins
907*ab45ba71SJames Collins                    if(count($MIKIO_ICONS) > 0) {
908*ab45ba71SJames Collins                        $icon = $MIKIO_ICONS[0];
909*ab45ba71SJames Collins
910*ab45ba71SJames Collins                        if(count($matches) > 1) {
911*ab45ba71SJames Collins                            $e = explode(' ', $matches[1]);
912*ab45ba71SJames Collins
913*ab45ba71SJames Collins                            if(count($e) > 1) {
914*ab45ba71SJames Collins                                foreach($MIKIO_ICONS as $iconItem) {
915*ab45ba71SJames Collins                                    if(strcasecmp($iconItem['name'], $e[0]) == 0) {
916*ab45ba71SJames Collins                                        $icon = $iconItem;
917*ab45ba71SJames Collins
918*ab45ba71SJames Collins                                        $s = $icon['insert'];
919*ab45ba71SJames Collins                                        for($i = 1; $i < 9; $i++) {
920*ab45ba71SJames Collins                                            if(count($e) < $i || $e[$i] == '') {
921*ab45ba71SJames Collins                                                if(isset($icon['$'.$i])) {
922*ab45ba71SJames Collins                                                    $s = str_replace('$' . $i, $icon['$'.$i], $s);
923*ab45ba71SJames Collins                                                }
924*ab45ba71SJames Collins                                            } else {
925*ab45ba71SJames Collins                                                $s = str_replace('$' . $i, $e[$i], $s);
926*ab45ba71SJames Collins                                            }
927*ab45ba71SJames Collins                                        }
928*ab45ba71SJames Collins
929*ab45ba71SJames Collins                                        $dir = '';
930*ab45ba71SJames Collins                                        if(isset($icon['dir'])) $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
931*ab45ba71SJames Collins
932*ab45ba71SJames Collins                                        $s = str_replace('$0', $dir, $s);
933*ab45ba71SJames Collins
934*ab45ba71SJames Collins                                    break;
935*ab45ba71SJames Collins                                    }
936*ab45ba71SJames Collins                                }
937*ab45ba71SJames Collins                            } else {
938*ab45ba71SJames Collins                                $s = str_replace('$1', $matches[1], $icon['insert']);
93975adba86SJames Collins                            }
94075adba86SJames Collins                        }
9412b4583abSJames Collins                    }
94275adba86SJames Collins
943*ab45ba71SJames Collins                    $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
944*ab45ba71SJames Collins                    if($count == 0) {
945*ab45ba71SJames Collins                        $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
946*ab45ba71SJames Collins                    }
947*ab45ba71SJames Collins
948*ab45ba71SJames Collins                    return $s;
949*ab45ba71SJames Collins                },
950*ab45ba71SJames Collins                $str);
951*ab45ba71SJames Collins        }
952*ab45ba71SJames Collins
953*ab45ba71SJames Collins        return $str;
954*ab45ba71SJames Collins    }
95547161538SJames Collins
956c165b184SJames Collins    /**
957c165b184SJames Collins     * Parse HTML for bootstrap
958c165b184SJames Collins     *
959c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
960c165b184SJames Collins     *
961c165b184SJames Collins     * @param   string  $content    HTML content to parse
962c165b184SJames Collins     * @return  string              Parsed HTML for bootstrap
963c165b184SJames Collins     */
96475adba86SJames Collins    public function parseContent($content) {
965*ab45ba71SJames Collins        global $INPUT, $ACT;
966*ab45ba71SJames Collins
967*ab45ba71SJames Collins
968*ab45ba71SJames Collins
969*ab45ba71SJames Collins        /*
970*ab45ba71SJames Collins        return $content;
971*ab45ba71SJames Collins
972*ab45ba71SJames Collins        if($INPUT->str('page') == 'config') {
973*ab45ba71SJames Collins            // Mikio sections
974*ab45ba71SJames Collins            $admin_sections = array(
975*ab45ba71SJames Collins                // Section                  Insert Before           Icon
976*ab45ba71SJames Collins                'navbar'            => array('navbarUseTitleIcon',       'mdi:palette'),
977*ab45ba71SJames Collins            );
978*ab45ba71SJames Collins
979*ab45ba71SJames Collins            foreach ($admin_sections as $section => $items) {
980*ab45ba71SJames Collins
981*ab45ba71SJames Collins                $search = $items[0];
982*ab45ba71SJames Collins                $icon   = $items[1];
983*ab45ba71SJames Collins
984*ab45ba71SJames Collins                // $content = preg_replace('/<tr(.*)>\s+<td(.*)>\s+<span(.*)>(tpl»mikio»' . $search . ')<\/span>/',
985*ab45ba71SJames Collins                //     '</table></div></fieldset><fieldset id="bootstrap3__' . $section . '"><legend>' . $icon . ' ' . tpl_getLang("config_$section") . '</legend><div class="table-responsive"><table class="table table-hover table-condensed inline"><tr$1><td$2><span$3>$4</span>', $content);
986*ab45ba71SJames Collins
987*ab45ba71SJames Collins                $content = preg_replace('/<tr(.*)>\s+<td(.*)>\s+<span(.*)>(tpl»mikio»' . $search . ')<\/span>/',
988*ab45ba71SJames Collins                '<tr class="default"><td class="mikio-config-table-header" colspan="2">' . tpl_getLang('config_' . $section) . '</td></tr><tr$1><td$2><span$3>$4</span>', $content);
989*ab45ba71SJames Collins
990*ab45ba71SJames Collins
991*ab45ba71SJames Collins
992*ab45ba71SJames Collins
993*ab45ba71SJames Collins            }
994*ab45ba71SJames Collins        }
995*ab45ba71SJames Collins*/
996*ab45ba71SJames Collins
997*ab45ba71SJames Collins
998*ab45ba71SJames Collins
99947161538SJames Collins        $html = new \simple_html_dom;
1000c165b184SJames Collins        $html->load($content, true, false);
1001c165b184SJames Collins
1002*ab45ba71SJames Collins        if (!$html) return $content;
1003*ab45ba71SJames Collins
1004*ab45ba71SJames Collins        /* Buttons */
1005*ab45ba71SJames Collins        foreach($html->find('#config__manager button') as $node) {
1006*ab45ba71SJames Collins            $c = explode(' ', $node->class);
1007*ab45ba71SJames Collins            if(!in_array('mikio-button', $c)) $c[] = 'mikio-button';
1008*ab45ba71SJames Collins            $node->class = implode(' ', $c);
1009c165b184SJames Collins        }
1010c165b184SJames Collins
1011*ab45ba71SJames Collins
1012*ab45ba71SJames Collins        /* Buttons - Primary */
1013*ab45ba71SJames Collins        foreach($html->find('#config__manager [type=submit]') as $node) {
1014*ab45ba71SJames Collins            $c = explode(' ', $node->class);
1015*ab45ba71SJames Collins            if(!in_array('mikio-primary', $c)) $c[] = 'mikio-primary';
1016*ab45ba71SJames Collins            $node->class = implode(' ', $c);
1017*ab45ba71SJames Collins        }
1018*ab45ba71SJames Collins
1019*ab45ba71SJames Collins
1020*ab45ba71SJames Collins
1021*ab45ba71SJames Collins
1022*ab45ba71SJames Collins        $content = $html->save();
1023*ab45ba71SJames Collins        $html->clear();
1024*ab45ba71SJames Collins        unset($html);
1025*ab45ba71SJames Collins
1026*ab45ba71SJames Collins        return $content;
1027*ab45ba71SJames Collins
1028*ab45ba71SJames Collins
1029*ab45ba71SJames Collins
1030*ab45ba71SJames Collins
1031*ab45ba71SJames Collins
1032*ab45ba71SJames Collins
1033*ab45ba71SJames Collins
103447161538SJames Collins        # Hide page title if hero is enabled
1035*ab45ba71SJames Collins        if($this->getConf('heroTitle')) {
103647161538SJames Collins            $pageTitle = tpl_pagetitle(null, true);
103747161538SJames Collins
103847161538SJames Collins            foreach($html->find('h1,h2,h3,h4') as $elm) {
103947161538SJames Collins                if($elm->innertext == $pageTitle) {
104047161538SJames Collins                    $elm->innertext = '';
104147161538SJames Collins                    break;
104247161538SJames Collins                }
104347161538SJames Collins            }
104447161538SJames Collins        }
1045c165b184SJames Collins
10462b4583abSJames Collins        # Hero subtitle
10472b4583abSJames Collins        foreach($html->find('p') as $elm) {
10482b4583abSJames Collins            $i = stripos($elm->innertext, '~~hero-subtitle');
10492b4583abSJames Collins            if($i !== false) {
10502b4583abSJames Collins                $j = strpos($elm->innertext, '~~', $i + 2);
10512b4583abSJames Collins                if($j !== false) {
10522b4583abSJames Collins                    if($j > $i + 16) {
10532b4583abSJames Collins                        $subtitle = substr($elm->innertext, $i + 16, $j - $i - 16);
10542b4583abSJames Collins                        foreach($html->find('.mikio-hero-subtext') as $subtitleElm) {
10552b4583abSJames Collins                           $subtitleElm->innertext = $subtitle;
10562b4583abSJames Collins                        }
10572b4583abSJames Collins                    }
10582b4583abSJames Collins
10592b4583abSJames Collins                    $elm->innertext = substr($elm->innertext, $j + 2);
10602b4583abSJames Collins                    break;
10612b4583abSJames Collins                }
10622b4583abSJames Collins            }
10632b4583abSJames Collins        }
10642b4583abSJames Collins
1065*ab45ba71SJames Collins        // Buttons
1066*ab45ba71SJames Collins        // foreach($html->find('.button') as $elm) {
1067*ab45ba71SJames Collins        //     if ($elm->tag == 'form') {
1068*ab45ba71SJames Collins        //         continue;
1069*ab45ba71SJames Collins        //     }
1070*ab45ba71SJames Collins        //     $elm->class .= ' btn';
1071*ab45ba71SJames Collins        // }
1072*ab45ba71SJames Collins
1073*ab45ba71SJames Collins        foreach($html->find('#config__manager [type=submit], #edbtn__save, #dw__login [type=submit]') as $elm) {
1074*ab45ba71SJames Collins            if(stripos($elm->class, 'btn') === FALSE) {
1075*ab45ba71SJames Collins                $elm->class .= ' btn btn-primary';
1076c165b184SJames Collins            }
1077c165b184SJames Collins        }
1078c165b184SJames Collins
1079*ab45ba71SJames Collins        foreach($html->find('button, [type=button], [type=submit], [type=reset]') as $elm) {
1080*ab45ba71SJames Collins            if(stripos($elm->class, 'btn') === FALSE) {
1081c165b184SJames Collins                $elm->class .= ' btn btn-outline-secondary';
1082c165b184SJames Collins            }
10832b4583abSJames Collins        }
1084c165b184SJames Collins
1085c165b184SJames Collins        foreach($html->find('.btn_secedit [type=submit]') as $elm) {
1086c165b184SJames Collins            $elm->class .= ' btn-sm';
1087c165b184SJames Collins        }
1088c165b184SJames Collins
1089*ab45ba71SJames Collins
1090c165b184SJames Collins        # Section Edit icons
1091c165b184SJames Collins        foreach($html->find('.secedit.editbutton_section button') as $elm) {
1092c165b184SJames Collins            $elm->innertext = '<i class="fa fa-edit" aria-hidden="true"></i> ' . $elm->innertext;
1093c165b184SJames Collins        }
1094c165b184SJames Collins
1095*ab45ba71SJames Collins        // Success
1096*ab45ba71SJames Collins        foreach($html->find('div.success') as $elm) {
1097*ab45ba71SJames Collins            $elm->class = 'alert alert-success'; //str_ireplace('success', 'alert alert-success', $elm->class);
1098*ab45ba71SJames Collins        }
1099c165b184SJames Collins
1100*ab45ba71SJames Collins        // Error
1101*ab45ba71SJames Collins        foreach($html->find('div.error') as $elm) {
1102*ab45ba71SJames Collins            $elm->class = 'alert alert-danger'; //str_ireplace('success', 'alert alert-success', $elm->class);
1103*ab45ba71SJames Collins        }
1104*ab45ba71SJames Collins
1105*ab45ba71SJames Collins        // Forms
1106*ab45ba71SJames Collins        foreach($html->find('input, select') as $elm) {
1107*ab45ba71SJames Collins            $elm->class .= ' form-control';
1108*ab45ba71SJames Collins        }
1109*ab45ba71SJames Collins
1110*ab45ba71SJames Collins        foreach($html->find('h1, h2, h3, h4, h5') as $elm) {
1111*ab45ba71SJames Collins            preg_match_all('/&lt;(.*)&gt;/iU', $elm->innertext, $matches);
1112*ab45ba71SJames Collins            if(count($matches) >= 2 && (count($matches[0]) == count($matches[1]))) {
1113*ab45ba71SJames Collins                for($i = 0; $i < count($matches[0]); $i++) {
1114*ab45ba71SJames Collins                    $icon = '';
1115*ab45ba71SJames Collins
1116*ab45ba71SJames Collins                    $class = explode(' ', $matches[1][$i]);
1117*ab45ba71SJames Collins                    if(count($class) >= 2) {
1118*ab45ba71SJames Collins                        $icon = '<i class="fa fa-' . $class[1] . '"></i>';
1119*ab45ba71SJames Collins                    }
1120*ab45ba71SJames Collins
1121*ab45ba71SJames Collins                    $elm->innertext = str_ireplace($matches[0][$i], $icon, $elm->innertext);
1122*ab45ba71SJames Collins                    }
1123*ab45ba71SJames Collins            }
1124*ab45ba71SJames Collins        }
1125*ab45ba71SJames Collins
1126*ab45ba71SJames Collins        // Tables
1127*ab45ba71SJames Collins        foreach($html->find('table') as $elm) {
1128*ab45ba71SJames Collins            $elm->class .= ' table-striped';
1129*ab45ba71SJames Collins        }
1130*ab45ba71SJames Collins
1131*ab45ba71SJames Collins        // Tabs
1132*ab45ba71SJames Collins        foreach($html->find('ul.tabs') as $tabs) {
1133*ab45ba71SJames Collins            $tabs->class = 'nav nav-tabs';
1134*ab45ba71SJames Collins            foreach($tabs->find('li') as $tab) {
1135*ab45ba71SJames Collins                $tab->class .= ' nav-item';
1136*ab45ba71SJames Collins
1137*ab45ba71SJames Collins                foreach($tab->find('a') as $link) {
1138*ab45ba71SJames Collins                    if(stripos($tab->class, 'active') !== FALSE) {
1139*ab45ba71SJames Collins                        $link->class .= 'active';
1140*ab45ba71SJames Collins                    }
1141*ab45ba71SJames Collins
1142*ab45ba71SJames Collins                    $link->class .= ' nav-link';
1143*ab45ba71SJames Collins                }
1144*ab45ba71SJames Collins            }
1145*ab45ba71SJames Collins        }
1146*ab45ba71SJames Collins
1147*ab45ba71SJames Collins        // Toolbar
1148*ab45ba71SJames Collins        foreach($html->find('.tool__bar') as $toolbar) {
1149*ab45ba71SJames Collins            $toolbar->class .= ' btn-group';
1150*ab45ba71SJames Collins        }
1151*ab45ba71SJames Collins
1152*ab45ba71SJames Collins        // Configuration Manager
1153*ab45ba71SJames Collins        if($INPUT->str('page') == 'config') {
1154*ab45ba71SJames Collins
1155*ab45ba71SJames Collins            // Additional save buttons
1156*ab45ba71SJames Collins            foreach ($html->find('#config__manager') as $cm) {
1157*ab45ba71SJames Collins                $saveButtons = '';
1158*ab45ba71SJames Collins
1159*ab45ba71SJames Collins                foreach($cm->find('p') as $elm) {
1160*ab45ba71SJames Collins                    $saveButtons = $elm->outertext;
1161*ab45ba71SJames Collins                    $elm->outertext = '';
1162*ab45ba71SJames Collins                }
1163*ab45ba71SJames Collins
1164*ab45ba71SJames Collins                foreach($cm->find('fieldset') as $elm) {
1165*ab45ba71SJames Collins                    $elm->innertext .= $saveButtons;
1166*ab45ba71SJames Collins                }
1167*ab45ba71SJames Collins            }
1168*ab45ba71SJames Collins
1169*ab45ba71SJames Collins        }
1170*ab45ba71SJames Collins
1171*ab45ba71SJames Collins        $content = $html->save();
1172c165b184SJames Collins        $html->clear();
1173c165b184SJames Collins        unset($html);
1174c165b184SJames Collins
1175*ab45ba71SJames Collins        // Remove icons
1176*ab45ba71SJames Collins        // $content = preg_replace('/&lt;icon .*&gt;[ +]/', '', $content);
1177*ab45ba71SJames Collins        $content = $this->includeIcons($content);
1178*ab45ba71SJames Collins
1179c165b184SJames Collins        return $content;
1180c165b184SJames Collins    }
11812b4583abSJames Collins
11822b4583abSJames Collins
11832b4583abSJames Collins    /*** GET LINK ***/
11842b4583abSJames Collins    public function getLink($str) {
11852b4583abSJames Collins        $i = strpos($str, '://');
11862b4583abSJames Collins        if($i !== false) return $str;
11872b4583abSJames Collins
11882b4583abSJames Collins        return wl($str);
11892b4583abSJames Collins    }
1190*ab45ba71SJames Collins
1191*ab45ba71SJames Collins
1192*ab45ba71SJames Collins    public function userCanEdit() {
1193*ab45ba71SJames Collins        global $INFO;
1194*ab45ba71SJames Collins        global $ID;
1195*ab45ba71SJames Collins
1196*ab45ba71SJames Collins        $wiki_file = wikiFN($ID);
1197*ab45ba71SJames Collins        if (@!file_exists($wiki_file)) return true;
1198*ab45ba71SJames Collins        if ($INFO['isadmin'] || $INFO['ismanager']) return true;
1199*ab45ba71SJames Collins        $meta_file = metaFN($ID, '.meta');
1200*ab45ba71SJames Collins        if (!$INFO['meta']['user']) return true;
1201*ab45ba71SJames Collins        if ($INFO['client'] ==  $INFO['meta']['user']) return true;
1202*ab45ba71SJames Collins
1203*ab45ba71SJames Collins        return false;
1204c165b184SJames Collins    }
120547161538SJames Collins
120647161538SJames Collins
1207*ab45ba71SJames Collins    public function getMediaFile($image) {
1208*ab45ba71SJames Collins        global $INFO;
1209*ab45ba71SJames Collins        $prefix = array(':'.$INFO['namespace'].':', ':', ':wiki:');
1210*ab45ba71SJames Collins        $ext = array('png', 'jpg', 'gif', 'svg');
1211*ab45ba71SJames Collins
1212*ab45ba71SJames Collins        $prefix[] = ':'.$INFO['namespace'].':';
1213*ab45ba71SJames Collins        $prefix[] = ':';
1214*ab45ba71SJames Collins        $prefix[] = ':wiki:';
1215*ab45ba71SJames Collins        $theme = $this->getConf('customTheme');
1216*ab45ba71SJames Collins        if($theme != '') $prefix[] = $this->tplDir . 'themes/' . $theme . '/images/';
1217*ab45ba71SJames Collins        $prefix[] = 'images/';
1218*ab45ba71SJames Collins
1219*ab45ba71SJames Collins        $search = array();
1220*ab45ba71SJames Collins        foreach($prefix as $pitem) {
1221*ab45ba71SJames Collins            foreach($ext as $eitem) {
1222*ab45ba71SJames Collins                $search[] = $pitem . $image . '.' . $eitem;
1223*ab45ba71SJames Collins            }
1224*ab45ba71SJames Collins        }
1225*ab45ba71SJames Collins
1226*ab45ba71SJames Collins        $img = '';
1227*ab45ba71SJames Collins        $file = '';
1228*ab45ba71SJames Collins        $url = '';
1229*ab45ba71SJames Collins        $ismedia = false;
1230*ab45ba71SJames Collins        $found = false;
1231*ab45ba71SJames Collins
1232*ab45ba71SJames Collins        foreach($search as $img) {
1233*ab45ba71SJames Collins            if(substr($img, 0, 1) == ':') {
1234*ab45ba71SJames Collins                $file    = mediaFN($img);
1235*ab45ba71SJames Collins                $ismedia = true;
1236*ab45ba71SJames Collins            } else {
1237*ab45ba71SJames Collins                $file    = tpl_incdir().$img;
1238*ab45ba71SJames Collins                $ismedia = false;
1239*ab45ba71SJames Collins            }
1240*ab45ba71SJames Collins
1241*ab45ba71SJames Collins            if(file_exists($file)) {
1242*ab45ba71SJames Collins                $found = true;
1243*ab45ba71SJames Collins                break;
1244*ab45ba71SJames Collins            }
1245*ab45ba71SJames Collins        }
1246*ab45ba71SJames Collins
1247*ab45ba71SJames Collins        if(!$found) return false;
1248*ab45ba71SJames Collins
1249*ab45ba71SJames Collins        if($ismedia) {
1250*ab45ba71SJames Collins            $url = ml($img, '', true, '', false);
1251*ab45ba71SJames Collins        } else {
1252*ab45ba71SJames Collins            $url = tpl_basedir().$img;
1253*ab45ba71SJames Collins        }
1254*ab45ba71SJames Collins
1255*ab45ba71SJames Collins        return $url;
1256*ab45ba71SJames Collins    }
1257*ab45ba71SJames Collins
1258*ab45ba71SJames Collins    /** ----
1259*ab45ba71SJames Collins     * Print or return the page title
1260*ab45ba71SJames Collins     *
1261*ab45ba71SJames Collins     * @param string    $page       page id or empty string for current page
1262*ab45ba71SJames Collins     * @param boolean   $print      print the generated content to the output buffer
1263*ab45ba71SJames Collins     *
1264*ab45ba71SJames Collins     * @return string               generated content
1265*ab45ba71SJames Collins     */
1266*ab45ba71SJames Collins    public function includePageTitle($page = '', $print = TRUE) {
1267*ab45ba71SJames Collins        global $ID, $conf;
1268*ab45ba71SJames Collins
1269*ab45ba71SJames Collins        $html = '';
1270*ab45ba71SJames Collins
1271*ab45ba71SJames Collins        if($page == '') $page = $ID;
1272*ab45ba71SJames Collins
1273*ab45ba71SJames Collins        $html = p_get_first_heading($page);
1274*ab45ba71SJames Collins        $html = strip_tags($html);
1275*ab45ba71SJames Collins        $html = preg_replace('/\s+/', ' ', $html);
1276*ab45ba71SJames Collins        $html .= ' [' . strip_tags($conf['title']) . ']';
1277*ab45ba71SJames Collins        $html = trim($html);
1278*ab45ba71SJames Collins
1279*ab45ba71SJames Collins        if($print) echo $html;
1280*ab45ba71SJames Collins        return $html;
1281*ab45ba71SJames Collins    }
1282*ab45ba71SJames Collins}
1283*ab45ba71SJames Collins
1284*ab45ba71SJames Collins
1285*ab45ba71SJames Collins
1286*ab45ba71SJames Collinsglobal $TEMPLATE;
128747161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();
1288