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