* @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html) */ namespace dokuwiki\template\mikio; if (!defined('DOKU_INC')) die(); require_once('icons/icons.php'); require_once('inc/simple_html_dom.php'); class Template { public $tplDir = ''; public $baseDir = ''; public $footerScript = array(); /** * Class constructor */ public function __construct() { $this->tplDir = tpl_incdir(); $this->baseDir = tpl_basedir(); $this->_registerHooks(); } /** * Returns the instance of the class * * @return Template class instance */ public static function getInstance() { static $instance = null; if ($instance === null) { $instance = new Template(); } return $instance; } /** * Register the themes hooks into Dokuwiki */ private function _registerHooks() { global $EVENT_HANDLER; $events_dispatcher = array( 'TPL_METAHEADER_OUTPUT' => 'metaheadersHandler' ); foreach ($events_dispatcher as $event => $method) { $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method); } } /** * Meta handler hook for DokuWiki * * @param Doku_Event $event */ public function metaHeadersHandler(\Doku_Event $event) { global $MIKIO_ICONS; $this->includePage('theme', FALSE, TRUE); $stylesheets = array(); $scripts = array(); if($this->getConf('customTheme') != '') { if(file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less')) { $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less'; } else { if(file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css')) { $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css'; } } if(file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js')) { $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js'; } } if(is_array($MIKIO_ICONS) && $this->getConf('iconTag', 'icon') != '') { $icons = Array(); foreach($MIKIO_ICONS as $icon) { if(isset($icon['name']) && isset($icon['css']) && isset($icon['insert'])) { $icons[] = $icon; if($icon['css'] != '') { if(strpos($icon['css'], '//') === FALSE) { $stylesheets[] = $this->baseDir . 'icons/' . $icon['css']; } else { $stylesheets[] = $icon['css']; } } } } $MIKIO_ICONS = $icons; } else { $MIKIO_ICONS = []; } $scripts[] = $this->baseDir . 'assets/mikio.js'; $stylesheets[] = $this->baseDir . 'assets/mikio.less'; $set = []; foreach ($stylesheets as $style) { if(in_array($style, $set) == FALSE) { if(strtolower(substr($style, -5)) == '.less') { $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style); } array_unshift($event->data['link'], array( 'type' => 'text/css', 'rel' => 'stylesheet', 'href' => $style )); } $set[] = $style; } $set = []; foreach ($scripts as $script) { if(in_array($script, $set) == FALSE) { $event->data['script'][] = array( 'type' => 'text/javascript', '_data' => '', 'src' => $script); } $set[] = $script; } } /** * Print or return the footer meta data * * @param boolean $print print the data to buffer */ public function includeFooterMeta($print = TRUE) { $html = ''; if(count($this->footerScript) > 0) { $html .= ''; } if($print) echo $html; return $html; } /** * Retreive and parse theme configuration options * * @param string $key the configuration key to retreive * @param mixed $default if key doesn't exist, return this value * @return mixed parsed value of configuration */ public function getConf($key, $default = FALSE) { $value = tpl_getConf($key, $default); switch($key) { case 'navbarDWMenuType': $value = strtolower($value); if($value != 'icons' && $value != 'text' && $value != 'both') $value = 'both'; break; case 'navbarDWMenuCombine': $value = strtolower($value); if($value != 'seperate' && $value != 'dropdown' && $value != 'combine') $value = 'combine'; break; case 'navbarPosLeft': case 'navbarPosMiddle': case 'navbarPosRight': $value = strtolower($value); if($value != 'none' && $value != 'custom' && $value != 'search' && $value != 'dokuwiki') { if($key == 'navbarPosLeft') $value = 'none'; if($key == 'navbarPosMiddle') $value = 'search'; if($key == 'navbarPosRight') $value = 'dokuwiki'; } break; case 'searchButton': $value = strtolower($value); if($value != 'icon' && $value != 'text') $value = 'icon'; break; case 'searchButton': $value = strtolower($value); if($value != 'icon' && $value != 'text') $value = 'icon'; break; case 'breadcrumbPosition': $value = strtolower($value); if($value != 'none' && $value != 'top' && $value != 'hero' && $value != 'page') $value = 'top'; break; case 'breadcrumbHome': $value = strtolower($value); if($value != 'none' && $value != 'page title' && $value != 'home' && $value != 'icon') $value = 'page title'; break; case 'sidebarLeftRow1': case 'sidebarLeftRow2': case 'sidebarLeftRow3': case 'sidebarLeftRow4': $value = strtolower($value); if($value != 'none' && $value != 'logged in user' && $value != 'search' && $value != 'content' && $value != 'tags') { if($key == 'sidebarLeftRow1') $value = 'logged in user'; if($key == 'sidebarLeftRow2') $value = 'search'; if($key == 'sidebarLeftRow3') $value = 'content'; if($key == 'sidebarLeftRow4') $value = 'none'; } break; case 'pageToolsFloating': case 'pageToolsFooter': $value = strtolower($value); if($value != 'none' && $value != 'page editors' && $value != 'always') { if($key == 'pageToolsFloating') $value = 'always'; if($key == 'pageToolsFooter') $value = 'always'; } break; case 'licenseType': $value = strtolower($value); if($value != 'none' && $value != 'badge' && $value != 'buttom') $value = 'badge'; break; case 'navbarUseTitleIcon': case 'navbarUseTitleText': case 'navbarUseTaglineText': case 'navbarShowSub': case 'heroTitle': case 'heroImagePropagation': case 'breadcrumbPrefix': case 'breadcrumbSep': case 'sidebarShowLeft': case 'sidebarShowRight': case 'tocFull': case 'footerSearch': case 'licenseImageOnly': case 'includePageUseACL': case 'includePagePropagate': case 'breadcrumbHideHome': case 'tagsConsolidate': case 'footerInPage': $value = (bool)$value; break; case 'breadcrumbShowLast': $value = (int)$value; break; case 'iconTag': case 'customTheme': case 'navbarCustomMenuText': case 'breadcrumbPrefixText': case 'breadcrumbSepText': case 'footerCustomMenuText': break; } return $value; } /** * Check if a page exist in directory or namespace * * @param string $page page/namespace to search * @return boolean if page exists */ public function pageExists($page) { ob_start(); tpl_includeFile($page . '.html'); $html = ob_get_contents(); ob_end_clean(); if($html != '') return TRUE; $useACL = $this->getConf('includePageUseACL'); $propagate = $this->getConf('includePagePropagate'); if($propagate) { if(page_findnearest($page, $useACL)) return TRUE; } elseif($useACL && auth_quickaclcheck($page) != AUTH_NONE) { return TRUE; } return FALSE; } /** * Print or return page from directory or namespace * * @param string $page page/namespace to include * @param boolean $print print content * @param boolean $parse parse content before printing/returning * @param string $classWrapper wrap page in a div with class * @return string contents of page found */ public function includePage($page, $print = TRUE, $parse = TRUE, $classWrapper = '') { ob_start(); tpl_includeFile($page . '.html'); $html = ob_get_contents(); ob_end_clean(); if($html == '') { $useACL = $this->getConf('includePageUseACL'); $propagate = $this->getConf('includePagePropagate'); $html = ''; $html = tpl_include_page($page, false, $propagate, $useACL); } if($html != '' && $parse) { $html = $this->parseContent($html); } if($classWrapper != '' && $html != '') $html = '
', '
', $saveButtons); $elm->outertext = ''; } foreach($cm->find('fieldset') as $elm) { $elm->innertext .= $saveButtons; } } } $content = $html->save(); $html->clear(); unset($html); return $content; } /** * Get DokuWiki namespace/page/URI as link * * @param string $str string to parse * @return string parsed uri */ public function getLink($str) { $i = strpos($str, '://'); if($i !== false) return $str; return wl($str); } /** * Check if the user can edit current namespace/page * * @return boolean user can edit */ public function userCanEdit() { global $INFO; global $ID; $wiki_file = wikiFN($ID); if (@!file_exists($wiki_file)) return true; if ($INFO['isadmin'] || $INFO['ismanager']) return true; // $meta_file = metaFN($ID, '.meta'); if (!$INFO['meta']['user']) return true; if ($INFO['client'] == $INFO['meta']['user']) return true; return false; } /** * Search for and return the uri of a media file * * @param string $image image name to search for (without extension) * @param bool $searchCurrentNS search the current namespace * @return string uri of the found media file */ public function getMediaFile($image, $searchCurrentNS=TRUE, $propagate=TRUE) { global $INFO; $ext = array('png', 'jpg', 'gif', 'svg'); if($searchCurrentNS) $prefix[] = ':'.$INFO['namespace'].':'; if($propagate) { $prefix[] = ':'; $prefix[] = ':wiki:'; } $theme = $this->getConf('customTheme'); if($theme != '') $prefix[] = $this->tplDir . 'themes/' . $theme . '/images/'; $prefix[] = 'images/'; $search = array(); foreach($prefix as $pitem) { foreach($ext as $eitem) { $search[] = $pitem . $image . '.' . $eitem; } } $img = ''; $file = ''; $url = ''; $ismedia = false; $found = false; foreach($search as $img) { if(substr($img, 0, 1) == ':') { $file = mediaFN($img); $ismedia = true; } else { $file = tpl_incdir().$img; $ismedia = false; } if(file_exists($file)) { $found = true; break; } } if(!$found) return false; if($ismedia) { $url = ml($img, '', true, '', false); } else { $url = tpl_basedir().$img; } return $url; } /** * Print or return the page title * * @param string $page page id or empty string for current page * @return string generated content */ public function getPageTitle($page = '') { global $ID, $conf; $html = ''; if($page == '') $page = $ID; $html = p_get_first_heading($page); $html = strip_tags($html); $html = preg_replace('/\s+/', ' ', $html); $html .= ' [' . strip_tags($conf['title']) . ']'; $html = trim($html); return $html; } /** * Return inline theme icon * * @param string $type icon to retreive * @return string html icon content */ public function mikioInlineIcon($type) { switch($type) { case 'wrench': return ''; case 'file': return ''; case 'gear': return ''; case 'user': return ''; case 'search': return ''; case 'home': return ''; } return ''; } /** * Finalize theme */ public function finalize() { } } global $TEMPLATE; $TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();