xref: /template/mikio/mikio.php (revision 471615384437d6616f95ab78b3ee5a17e9d657f2)
1c165b184SJames Collins<?php
2*47161538SJames Collins
3*47161538SJames Collinsnamespace dokuwiki\template\mikio;
4*47161538SJames Collins
5c165b184SJames Collins/**
6c165b184SJames Collins * DokuWiki Mikio Template
7c165b184SJames Collins *
8c165b184SJames Collins * @link    http://dokuwiki.org/template:mikio
9c165b184SJames Collins * @author  James Collins <james.collins@outlook.com.au>
10c165b184SJames Collins * @license MIT License (https://raw.githubusercontent.com/nomadjimbob/Mikio/master/LICENSE)
11c165b184SJames Collins */
12c165b184SJames Collins
13c165b184SJames Collinsif (!defined('DOKU_INC')) die();
14c165b184SJames Collins
15c165b184SJames Collinsrequire_once('inc/simple_html_dom.php');
16c165b184SJames Collins
17*47161538SJames Collinsclass Template {
18c165b184SJames Collins  public $tplDir  = '';
19c165b184SJames Collins  public $baseDir = '';
20c165b184SJames Collins
21c165b184SJames Collins
22c165b184SJames Collins    /**
23c165b184SJames Collins     * Class constructor
24c165b184SJames Collins     *
25c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
26c165b184SJames Collins     */
27c165b184SJames Collins    public function __construct() {
28c165b184SJames Collins      $this->tplDir  = tpl_incdir();
29c165b184SJames Collins      $this->baseDir = tpl_basedir();
30c165b184SJames Collins
31c165b184SJames Collins      $this->_registerHooks();
32c165b184SJames Collins     }
33c165b184SJames Collins
34c165b184SJames Collins
35c165b184SJames Collins    /**
36*47161538SJames Collins     * Get the singleton instance
37*47161538SJames Collins     *
38*47161538SJames Collins     * @return Template
39*47161538SJames Collins     */
40*47161538SJames Collins    public static function getInstance()
41*47161538SJames Collins    {
42*47161538SJames Collins
43*47161538SJames Collins        static $instance = null;
44*47161538SJames Collins
45*47161538SJames Collins        if ($instance === null) {
46*47161538SJames Collins            $instance = new Template();
47*47161538SJames Collins        }
48*47161538SJames Collins
49*47161538SJames Collins        return $instance;
50*47161538SJames Collins
51*47161538SJames Collins    }
52*47161538SJames Collins
53*47161538SJames Collins    /**
54c165b184SJames Collins     * Register themes DokuWiki hooks
55c165b184SJames Collins     *
56c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
57c165b184SJames Collins     */
58c165b184SJames Collins    private function _registerHooks() {
59c165b184SJames Collins        global $EVENT_HANDLER;
60c165b184SJames Collins
61c165b184SJames Collins         $events_dispatcher = array(
62c165b184SJames Collins            'TPL_METAHEADER_OUTPUT'     => 'metaheadersHandler',
63c165b184SJames Collins            'TPL_CONTENT_DISPLAY'       => 'contentHandler',
64c165b184SJames Collins        );
65c165b184SJames Collins
66c165b184SJames Collins        foreach ($events_dispatcher as $event => $method) {
67c165b184SJames Collins            $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method);
68c165b184SJames Collins        }
69c165b184SJames Collins    }
70c165b184SJames Collins
71c165b184SJames Collins
72c165b184SJames Collins    /**
73c165b184SJames Collins     * DokuWiki META Header event handler
74c165b184SJames Collins     *
75c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
76c165b184SJames Collins     */
77*47161538SJames Collins    public function metaHeadersHandler(\Doku_Event $event) {
78c165b184SJames Collins        $stylesheets    = array();
79c165b184SJames Collins        $scripts        = array();
80c165b184SJames Collins
81c165b184SJames Collins        if($this->getConf('useTheme') != '') {
82c165b184SJames Collins            if(file_exists($this->tplDir . 'themes/' . $this->getConf('useTheme') . '/style.css')) {
83c165b184SJames Collins                $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('useTheme') . '/style.css';
84c165b184SJames Collins            }
85c165b184SJames Collins        }
86c165b184SJames Collins
87c165b184SJames Collins        $stylesheets[] = $this->baseDir . 'css/mikio.css';
88c165b184SJames Collins        $stylesheets[] = $this->baseDir . 'css/bootstrap.min.css';
89c165b184SJames Collins
90c165b184SJames Collins        if($this->getConf('includeFontAwesome') == true) $stylesheets[] = $this->baseDir . 'assets/fontawesome/css/all.min.css';
91c165b184SJames Collins
92c165b184SJames Collins        $scripts[] = $this->baseDir . 'js/bootstrap.min.js';
93c165b184SJames Collins
94c165b184SJames Collins        foreach ($stylesheets as $style) {
95c165b184SJames Collins            array_unshift($event->data['link'], array(
96c165b184SJames Collins                'type' => 'text/css',
97c165b184SJames Collins                'rel'  => 'stylesheet',
98c165b184SJames Collins                'href' => $style
99c165b184SJames Collins            ));
100c165b184SJames Collins        }
101c165b184SJames Collins
102c165b184SJames Collins        foreach ($scripts as $script) {
103c165b184SJames Collins            $event->data['script'][] = array(
104c165b184SJames Collins                 'type'  => 'text/javascript',
105c165b184SJames Collins              '_data' => '',
106c165b184SJames Collins              'src'   => $script
107c165b184SJames Collins          );
108c165b184SJames Collins      }
109c165b184SJames Collins    }
110c165b184SJames Collins
111c165b184SJames Collins
112c165b184SJames Collins    /**
113c165b184SJames Collins     * DokuWiki content event handler
114c165b184SJames Collins     *
115c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
116c165b184SJames Collins     */
117*47161538SJames Collins    public function contentHandler(\Doku_Event $event)
118c165b184SJames Collins    {
119c165b184SJames Collins        $event->data = $this->normalizeContent($event->data);
120c165b184SJames Collins    }
121c165b184SJames Collins
122c165b184SJames Collins
123c165b184SJames Collins    /**
124c165b184SJames Collins     * Parse configuration options
125c165b184SJames Collins     *
126c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
127c165b184SJames Collins     *
128c165b184SJames Collins     * @param   string  $key        The configuration key to retreive
129c165b184SJames Collins     * @param   mixed   $default    If key doesn't exist, return this value
130c165b184SJames Collins     * @return  mixed               Parsed value of configuration
131c165b184SJames Collins     */
132c165b184SJames Collins    public function getConf($key, $default = false) {
133c165b184SJames Collins        global $ACT, $conf;
134c165b184SJames Collins
135c165b184SJames Collins        $value = tpl_getConf($key, $default);
136c165b184SJames Collins
137c165b184SJames Collins        switch($key) {
138c165b184SJames Collins
139c165b184SJames Collins            case 'navbar':  // TODO is this needed?
140c165b184SJames Collins                $value = explode(',', $value);
141c165b184SJames Collins                break;
142c165b184SJames Collins
143c165b184SJames Collins            case 'showSidebar':
144c165b184SJames Collins                if ($ACT !== 'show') {
145c165b184SJames Collins                    return false;
146c165b184SJames Collins                }
147c165b184SJames Collins
148c165b184SJames Collins                return page_findnearest($conf['sidebar'], $this->getConf('useACL'));
149c165b184SJames Collins
150c165b184SJames Collins            case 'navbarMenuStyle':
151c165b184SJames Collins                if($value != 'text') {
152c165b184SJames Collins                    if(!$this->getConf('useFontAwesome')) {
153c165b184SJames Collins                        return 'text';
154c165b184SJames Collins                    }
155c165b184SJames Collins                }
156c165b184SJames Collins        }
157c165b184SJames Collins
158c165b184SJames Collins        return $value;
159c165b184SJames Collins    }
160c165b184SJames Collins
161c165b184SJames Collins
162c165b184SJames Collins    /**
163c165b184SJames Collins     * Icon
164c165b184SJames Collins     *
165c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
166c165b184SJames Collins     *
167c165b184SJames Collins     * @param   string  $type       The type of icon to return
168c165b184SJames Collins     * @return  string              HTML for icon element
169c165b184SJames Collins     */
170c165b184SJames Collins    public function icon($type) {
171c165b184SJames Collins        if($this->getConf('useFontAwesome')) {
172c165b184SJames Collins            return '<i class="fa fa-' . $type . '" aria-hidden="true"></i>';
173c165b184SJames Collins        }
174c165b184SJames Collins
175c165b184SJames Collins        return '';
176c165b184SJames Collins    }
177c165b184SJames Collins
178c165b184SJames Collins
179c165b184SJames Collins    /**
180c165b184SJames Collins     * Print the Navbar menu title/icon
181c165b184SJames Collins     *
182c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
183c165b184SJames Collins     *
184c165b184SJames Collins     * @param   string  $type       The type of icon to return
185c165b184SJames Collins     * @return  string              HTML for icon element
186c165b184SJames Collins     */
187c165b184SJames Collins    public function navbarMenuTitle($title, $icon) {
188c165b184SJames Collins        global $lang;
189c165b184SJames Collins
190c165b184SJames Collins        $title = '';
191c165b184SJames Collins
192c165b184SJames Collins        if($this->getConf('navbarMenuStyle') != 'text') {
193c165b184SJames Collins            $title .= $this->icon($icon);
194c165b184SJames Collins        }
195c165b184SJames Collins
196c165b184SJames Collins        if($this->getConf('navbarMenuStyle') != 'icon') {
197c165b184SJames Collins            $title .= $lang['user_tools'];
198c165b184SJames Collins        }
199c165b184SJames Collins
200c165b184SJames Collins        echo $title;
201c165b184SJames Collins    }
202c165b184SJames Collins
203c165b184SJames Collins
204c165b184SJames Collins     /**
205c165b184SJames Collins     * Add class to first DOM element
206c165b184SJames Collins     *
207c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
208c165b184SJames Collins     *
209c165b184SJames Collins     * @param   string  $content    HTML DOM
210c165b184SJames Collins     * @param   string  $class      Class to add DOM elements
211c165b184SJames Collins     * @return  string              HTML DOM with class added
212c165b184SJames Collins     */
213c165b184SJames Collins    public function elementAddClass($html, $class) {
214c165b184SJames Collins        preg_match('/class.*?".*?"/', $html, $matches);
215c165b184SJames Collins        if(count($matches) > 0) {
216c165b184SJames Collins            preg_match('/[" ]'.$class.'[" ]/', $matches[0], $matches);
217c165b184SJames Collins            if(count($matches) == 0) {
218c165b184SJames Collins                return preg_replace('/(class.*?=.*?")/', '${1}'.$class.' ', $html, 1);
219c165b184SJames Collins            }
220c165b184SJames Collins        } else {
221c165b184SJames Collins            return preg_replace('/>/', 'class="'.$class.'">', $html, 1);
222c165b184SJames Collins        }
223c165b184SJames Collins
224c165b184SJames Collins        return $html;
225c165b184SJames Collins    }
226c165b184SJames Collins
227c165b184SJames Collins
228c165b184SJames Collins    /**
229c165b184SJames Collins     * Include Sidebar
230c165b184SJames Collins     *
231c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
232c165b184SJames Collins     *
233c165b184SJames Collins     * @param   string  $type       Sidebar type
234c165b184SJames Collins     * @return  boolean             If sidebar was added
235c165b184SJames Collins     */
236c165b184SJames Collins    public function includeSidebar($type) {
237c165b184SJames Collins        global $conf;
238c165b184SJames Collins
239c165b184SJames Collins        switch($type) {
240c165b184SJames Collins            case 'left':
241c165b184SJames Collins                if($this->getConf('showSidebar')) {
242c165b184SJames Collins                    echo '<aside>';
243c165b184SJames Collins                    tpl_includeFile('sidebarheader.html');
244c165b184SJames Collins                    tpl_include_page($conf['sidebar'], 1, 1);
245c165b184SJames Collins                    tpl_includeFile('sidebarfooter.html');
246c165b184SJames Collins                    echo '</aside>';
247c165b184SJames Collins
248c165b184SJames Collins                    return true;
249c165b184SJames Collins                }
250c165b184SJames Collins
251c165b184SJames Collins                return false;
252c165b184SJames Collins        }
253c165b184SJames Collins
254c165b184SJames Collins        return false;
255c165b184SJames Collins    }
256c165b184SJames Collins
257c165b184SJames Collins
258*47161538SJames Collins    public function includeBreadcrumbs() {
259*47161538SJames Collins        global $conf;
260*47161538SJames Collins
261*47161538SJames Collins        if($conf['breadcrumbs']) {
262*47161538SJames Collins            print_r(breadcrumbs());
263*47161538SJames Collins            tpl_breadcrumbs('|');
264*47161538SJames Collins        }
265*47161538SJames Collins
266*47161538SJames Collins        if($conf['youarehere']) {
267*47161538SJames Collins            // print_r(youarehere());
268*47161538SJames Collins            tpl_youarehere('|');
269*47161538SJames Collins        }
270*47161538SJames Collins
271*47161538SJames Collins
272*47161538SJames Collins
273*47161538SJames Collins
274*47161538SJames Collins        // $crumbs = breadcrumbs();
275*47161538SJames Collins
276*47161538SJames Collins        // print '<ol class="breadcrumb">';
277*47161538SJames Collins        // print '<li>' . rtrim($lang['breadcrumb'], ':') . '</li>';
278*47161538SJames Collins
279*47161538SJames Collins        // $last = count($crumbs);
280*47161538SJames Collins        // $i    = 0;
281*47161538SJames Collins
282*47161538SJames Collins        // foreach ($crumbs as $id => $name) {
283*47161538SJames Collins
284*47161538SJames Collins        //     $i++;
285*47161538SJames Collins
286*47161538SJames Collins        //     print($i == $last) ? '<li class="active">' : '<li>';
287*47161538SJames Collins        //     tpl_link(wl($id), hsc($name), 'title="' . $id . '"');
288*47161538SJames Collins        //     print '</li>';
289*47161538SJames Collins
290*47161538SJames Collins        //     if ($i == $last) {
291*47161538SJames Collins        //         print '</ol>';
292*47161538SJames Collins        //     }
293*47161538SJames Collins
294*47161538SJames Collins        // }
295*47161538SJames Collins
296*47161538SJames Collins        // print_r($crumbs);
297*47161538SJames Collins    }
298*47161538SJames Collins
299c165b184SJames Collins    /**
300c165b184SJames Collins     * Parse HTML for bootstrap
301c165b184SJames Collins     *
302c165b184SJames Collins     * @author  James Collins <james.collins@outlook.com.au>
303c165b184SJames Collins     *
304c165b184SJames Collins     * @param   string  $content    HTML content to parse
305c165b184SJames Collins     * @return  string              Parsed HTML for bootstrap
306c165b184SJames Collins     */
307c165b184SJames Collins    public function normalizeContent($content) {
308*47161538SJames Collins        $html = new \simple_html_dom;
309c165b184SJames Collins        $html->load($content, true, false);
310c165b184SJames Collins
311c165b184SJames Collins        # Return original content if Simple HTML DOM fail or exceeded page size (default MAX_FILE_SIZE => 600KB)
312c165b184SJames Collins        if (!$html) {
313c165b184SJames Collins            return $content;
314c165b184SJames Collins        }
315c165b184SJames Collins
316*47161538SJames Collins        # Hide page title if hero is enabled
317*47161538SJames Collins        if($this->getConf('useHeroTitle')) {
318*47161538SJames Collins            $pageTitle = tpl_pagetitle(null, true);
319*47161538SJames Collins
320*47161538SJames Collins            foreach($html->find('h1,h2,h3,h4') as $elm) {
321*47161538SJames Collins                if($elm->innertext == $pageTitle) {
322*47161538SJames Collins                    $elm->innertext = '';
323*47161538SJames Collins                    break;
324*47161538SJames Collins                }
325*47161538SJames Collins            }
326*47161538SJames Collins        }
327c165b184SJames Collins
328c165b184SJames Collins        # Buttons
329c165b184SJames Collins        foreach ($html->find('.button') as $elm) {
330c165b184SJames Collins            if ($elm->tag == 'form') {
331c165b184SJames Collins                continue;
332c165b184SJames Collins            }
333c165b184SJames Collins            $elm->class .= ' btn';
334c165b184SJames Collins        }
335c165b184SJames Collins
336c165b184SJames Collins        foreach ($html->find('[type=button], [type=submit], [type=reset]') as $elm) {
337c165b184SJames Collins            $elm->class .= ' btn btn-outline-secondary';
338c165b184SJames Collins        }
339c165b184SJames Collins
340c165b184SJames Collins        # Section Edit Button
341c165b184SJames Collins        foreach ($html->find('.btn_secedit [type=submit]') as $elm) {
342c165b184SJames Collins            $elm->class .= ' btn-sm';
343c165b184SJames Collins        }
344c165b184SJames Collins
345c165b184SJames Collins        # Section Edit icons
346c165b184SJames Collins        foreach ($html->find('.secedit.editbutton_section button') as $elm) {
347c165b184SJames Collins            $elm->innertext = '<i class="fa fa-edit" aria-hidden="true"></i> ' . $elm->innertext;
348c165b184SJames Collins        }
349c165b184SJames Collins
350c165b184SJames Collins        $content = $html->save();
351c165b184SJames Collins
352c165b184SJames Collins        $html->clear();
353c165b184SJames Collins        unset($html);
354c165b184SJames Collins
355c165b184SJames Collins        return $content;
356c165b184SJames Collins    }
357c165b184SJames Collins}
358*47161538SJames Collins
359*47161538SJames Collinsglobal $TEMPLATE;
360*47161538SJames Collins
361*47161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();