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