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();