* @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html) */ namespace dokuwiki\template\mikio; if (defined('DOKU_INC') === false) { die(); } require_once('icons/icons.php'); require_once('inc/simple_html_dom.php'); class Template { /** * @var string Template directory path from local FS. */ public $tplDir = ''; /** * @var string Template directory path from web. */ public $baseDir = ''; /** * @var array Array of Javascript files to include in footer. */ public $footerScript = []; /** * @var boolean Ignore LESS files. */ public $lessIgnored = false; /** * 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 (empty($instance) === true) { $instance = new Template(); } return $instance; } /** * Register the themes hooks into Dokuwiki * * @return void */ private function registerHooks() { global $EVENT_HANDLER; $events_dispatcher = [ '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 DokuWiki Event. * @return void */ public function metaHeadersHandler(\Doku_Event $event) { global $MIKIO_ICONS; global $conf; $this->includePage('theme', false, true); $stylesheets = []; $scripts = []; if (empty($this->getConf('customTheme')) === false) { if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) { $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less'; } else { if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) { $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css'; } } if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) { $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js'; } } if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) { $icons = []; foreach ($MIKIO_ICONS as $icon) { if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) { $icons[] = $icon; if (empty($icon['css']) === false) { 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-typeahead.js'; $scripts[] = $this->baseDir . 'assets/mikio.js'; if ($this->getConf('useLESS') === true) { $stylesheets[] = $this->baseDir . 'assets/mikio.less'; } else { $stylesheets[] = $this->baseDir . 'assets/mikio.css'; } $set = []; foreach ($stylesheets as $style) { if (in_array($style, $set) === false) { if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) { $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style); } array_unshift($event->data['link'], [ 'type' => 'text/css', 'rel' => 'stylesheet', 'href' => $style ]); } $set[] = $style; } $set = []; foreach ($scripts as $script) { if (in_array($script, $set) === false) { $script_params = [ 'type' => 'text/javascript', '_data' => '', 'src' => $script ]; // equal to or greator than hogfather if ($this->dwVersionNumber() >= 20200729) { // greator than hogfather - defer always on if ($this->dwVersionNumber() >= 20200729) { $script_params += ['defer' => 'defer']; } else { // hogfather - defer always on unless $conf['defer_js'] is false if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) { $script_params += ['defer' => 'defer']; } } } $event->data['script'][] = $script_params; }//end if $set[] = $script; }//end foreach } /** * Print or return the footer meta data * * @param boolean $print Print the data to buffer. * @return string HTML footer meta data */ public function includeFooterMeta(bool $print = true) { $html = ''; if (count($this->footerScript) > 0) { $html .= ''; } if ($print === true) { 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(string $key, mixed $default = false) { $value = tpl_getConf($key, $default); $data = [ ['keys' => ['navbarDWMenuType'], 'type' => 'choice', 'values' => ['both', 'icons', 'text'] ], ['keys' => ['navbarDWMenuCombine'], 'type' => 'choice', 'values' => ['combine', 'seperate', 'dropdown'] ], ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'], 'type' => 'choice', 'values' => ['none', 'custom', 'search', 'dokuwiki'], 'default' => [ 'navbarPosLeft' => 'none', 'navbarPosMiddle' => 'search', 'navbarPosRight' => 'dokuwiki' ] ], ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink', 'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile', 'navbarItemShowAdmin' ], 'type' => 'choice', 'values' => ['always', 'logged in', 'logged out', 'never'] ], ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'], 'type' => 'choice', 'values' => ['always', 'never'] ], ['keys' => ['searchButton'], 'type' => 'choice', 'values' => ['icon', 'text'] ], ['keys' => ['breadcrumbPosition', 'youareherePosition'], 'type' => 'choice', 'values' => ['top', 'hero', 'page', 'none'] ], ['keys' => ['youarehereHome'], 'type' => 'choice', 'values' => ['page title', 'home', 'icon', 'none'] ], ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'], 'type' => 'choice', 'values' => ['none', 'logged in user', 'search', 'content', 'tags'], 'default' => [ 'sidebarLeftRow1' => 'logged in user', 'sidebarLeftRow2' => 'search', 'sidebarLeftRow3' => 'content' ] ], ['keys' => ['pageToolsFloating', 'pageToolsFooter'], 'type' => 'choice', 'values' => ['always', 'none', 'page editors'] ], ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink', 'pageToolsShowTop' ], 'type' => 'choice', 'values' => ['always', 'logged in', 'logged out', 'never'] ], ['keys' => ['showNotifications'], 'type' => 'choice', 'values' => ['admin', 'always', 'none'] ], ['keys' => ['licenseType'], 'type' => 'choice', 'values' => ['badge', 'button', 'none'] ], ['keys' => ['navbarUseTitleIcon'], 'type' => 'bool'], ['keys' => ['navbarUseTitleText'], 'type' => 'bool'], ['keys' => ['navbarUseTaglineText'], 'type' => 'bool'], ['keys' => ['navbarShowSub'], 'type' => 'bool'], ['keys' => ['heroTitle'], 'type' => 'bool'], ['keys' => ['heroImagePropagation'], 'type' => 'bool'], ['keys' => ['breadcrumbPrefix'], 'type' => 'bool'], ['keys' => ['breadcrumbSep'], 'type' => 'bool'], ['keys' => ['youareherePrefix'], 'type' => 'bool'], ['keys' => ['youarehereSep'], 'type' => 'bool'], ['keys' => ['sidebarShowLeft'], 'type' => 'bool'], ['keys' => ['sidebarShowRight'], 'type' => 'bool'], ['keys' => ['tocFull'], 'type' => 'bool'], ['keys' => ['footerSearch'], 'type' => 'bool'], ['keys' => ['licenseImageOnly'], 'type' => 'bool'], ['keys' => ['includePageUseACL'], 'type' => 'bool'], ['keys' => ['includePagePropagate'], 'type' => 'bool'], ['keys' => ['youarehereHideHome'], 'type' => 'bool'], ['keys' => ['tagsConsolidate'], 'type' => 'bool'], ['keys' => ['footerInPage'], 'type' => 'bool'], ['keys' => ['sidebarMobileDefaultCollapse'], 'type' => 'bool'], ['keys' => ['sidebarAlwaysShowLeft'], 'type' => 'bool'], ['keys' => ['sidebarAlwaysShowRight'], 'type' => 'bool'], ['keys' => ['searchUseTypeahead'], 'type' => 'bool'], ['keys' => ['youarehereShowLast'], 'type' => 'int'], ['keys' => ['iconTag'], 'type' => 'string'], ['keys' => ['customTheme'], 'type' => 'string'], ['keys' => ['navbarCustomMenuText'], 'type' => 'string'], ['keys' => ['breadcrumbPrefixText'], 'type' => 'string'], ['keys' => ['breadcrumbSepText'], 'type' => 'string'], ['keys' => ['youareherePrefixText'], 'type' => 'string'], ['keys' => ['youarehereSepText'], 'type' => 'string'], ['keys' => ['footerCustomMenuText'], 'type' => 'string'], ['keys' => ['brandURLGuest'], 'type' => 'string'], ['keys' => ['brandURLUser'], 'type' => 'string'], ['keys' => ['useLESS'], 'type' => 'less'], ]; foreach ($data as $row) { // does not check case.... if (in_array($key, $row['keys']) === true) { if (array_key_exists('type', 'row') === true) { switch ($row['type']) { case 'bool': return (bool) $value; case 'int': return (int) $value; case 'string': return $value; case 'less': $value = (bool) $value; $lessAvailable = true; // check for less library $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php'; if (file_exists($lesscLib) === false) { $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php'; } if (file_exists($lesscLib) === false) { $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; } if (file_exists($lesscLib) === false) { $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; } if (file_exists($lesscLib) === false) { $lessAvailable = false; } // check for ctype extensions if (function_exists('ctype_digit') === false) { $lessAvailable = false; } if ($value === true && $lessAvailable === false) { $this->lessIgnored = true; $value = false; } return $value; }//end switch }//end if if (in_array($value, $row['values']) === true) { return $value; } if (array_key_exists('default', $row) === true) { if (is_array($row['default']) === true) { if (array_key_exists($key, $row['default']) === true) { return $row['default'][$key]; } } else { return $row['default']; } } return reset($row['values']); }//end if }//end foreach 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(string $page) { ob_start(); tpl_includeFile($page . '.html'); $html = ob_get_contents(); ob_end_clean(); if (empty($html) === false) { return true; } $useACL = $this->getConf('includePageUseACL'); $propagate = $this->getConf('includePagePropagate'); if ($propagate === true) { if (page_findnearest($page, $useACL) !== false) { return true; } } elseif ($useACL === true && 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(string $page, bool $print = true, bool $parse = true, string $classWrapper = '') { ob_start(); tpl_includeFile($page . '.html'); $html = ob_get_contents(); ob_end_clean(); if (empty($html) === true) { $useACL = $this->getConf('includePageUseACL'); $propagate = $this->getConf('includePagePropagate'); $html = ''; $html = tpl_include_page($page, false, $propagate, $useACL); } if (empty($html) === false && $parse === true) { $html = $this->parseContent($html); } if (empty($classWrapper) === false && empty($html) === false) { $html = '
(.*)[^<]*/';
}
$content = preg_replace_callback($page_regex, function ($icons) {
$iconTag = $this->getConf('iconTag', 'icon');
return preg_replace_callback(
'/<' . $iconTag . ' ([\w\- #]*)>(?=[^>]*(<|$))/',
function ($matches) {
global $MIKIO_ICONS;
$s = $matches[0];
if (count($MIKIO_ICONS) > 0) {
$icon = $MIKIO_ICONS[0];
if (count($matches) > 1) {
$e = explode(' ', $matches[1]);
if (count($e) > 1) {
foreach ($MIKIO_ICONS as $iconItem) {
if (strcasecmp($iconItem['name'], $e[0]) === 0) {
$icon = $iconItem;
$s = $icon['insert'];
for ($i = 1; $i < 9; $i++) {
if (count(empty($e) < $i || $e[$i]) === true) {
if (isset($icon['$' . $i]) === true) {
$s = str_replace('$' . $i, $icon['$' . $i], $s);
}
} else {
$s = str_replace('$' . $i, $e[$i], $s);
}
}
$dir = '';
if (isset($icon['dir']) === true) {
$dir = $this->baseDir . 'icons/' . $icon['dir'] . '/';
}
$s = str_replace('$0', $dir, $s);
break;
}//end if
}//end foreach
} else {
$s = str_replace('$1', $matches[1], $icon['insert']);
}//end if
}//end if
}//end if
$s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count);
if ($count === 0) {
$s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s);
}
return $s;
},
$icons[0]
);
}, $content);
if (strcasecmp($ACT, 'preview') === 0) {
if (is_array($preview) === true && count($preview) > 0) {
$preview[0]->innertext = $content;
}
$str = $html->save();
$html->clear();
unset($html);
} else {
$str = $content;
}
}//end if
return $str;
}
/**
* Parse HTML for theme
*
* @param string $content HTML content to parse.
* @return string Parsed content
*/
public function parseContent(string $content)
{
global $INPUT, $ACT;
// Add Mikio Section titles
if (strcasecmp($INPUT->str('page'), 'config') === 0) {
$admin_sections = [
// Section Insert Before Icon
'navbar' => ['navbarUseTitleIcon', ''],
'search' => ['searchButton', ''],
'hero' => ['heroTitle', ''],
'tags' => ['tagsConsolidate', ''],
'breadcrumb' => ['breadcrumbHideHome', ''],
'youarehere' => ['youarehereHideHome', ''],
'sidebar' => ['sidebarShowLeft', ''],
'toc' => ['tocFull', ''],
'pagetools' => ['pageToolsFloating', ''],
'footer' => ['footerCustomMenuText', ''],
'license' => ['licenseType', ''],
'acl' => ['includePageUseACL', ''],
'sticky' => ['stickyTopHeader', ''],
];
foreach ($admin_sections as $section => $items) {
$search = $items[0];
$icon = $items[1];
$content = preg_replace(
'/\s*\s*(tpl»mikio»' . $search . ')<\/span>/',
'' . $this->mikioInlineIcon($icon) .
tpl_getLang('config_' . $section) .
' tpl»mikio»' .
$search . '',
$content
);
}
}//end if
if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) {
$content = preg_replace('/(.*?)<\/ul>.*?(.*?<\/ul>)/s', '$1$2', $content);
}
// Page Revisions - Table Fix
if (strpos($content, 'id="page__revisions"') !== false) {
$content = preg_replace(
'/(\s.*<\/span>\s.*\s.*<\/span>)/',
'$1',
$content
);
}
$html = new \simple_html_dom();
$html->stripRNAttrValues = false;
$html->load($content, true, false);
if ($html === false) {
return $content;
}
/* Buttons */
foreach ($html->find('#config__manager button') as $node) {
$c = explode(' ', $node->class);
if (in_array('mikio-button', $c) === false) {
$c[] = 'mikio-button';
}
$node->class = implode(' ', $c);
}
/* Buttons - Primary */
foreach ($html->find('#config__manager [type=submit]') as $node) {
$c = explode(' ', $node->class);
if (in_array('mikio-primary', $c) === false) {
$c[] = 'mikio-primary';
}
$node->class = implode(' ', $c);
}
/* Hide page title if hero is enabled */
if ($this->getConf('heroTitle') === true && $ACT !== 'preview') {
$pageTitle = $this->parsePageTitle();
foreach ($html->find('h1,h2,h3,h4') as $elm) {
if ($elm->innertext === $pageTitle) {
// $elm->innertext = '';
$elm->setAttribute('style', 'display:none');
break;
}
}
}
/* Hero subtitle */
foreach ($html->find('p') as $elm) {
$i = stripos($elm->innertext, '~~hero-subtitle');
if ($i !== false) {
$j = strpos($elm->innertext, '~~', ($i + 2));
if ($j !== false) {
if ($j > ($i + 16)) {
$subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16));
$this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')';
// $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2);
$elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext);
}
break;
}
}
}
/* Hero image */
foreach ($html->find('p') as $elm) {
$image = '';
preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches);
if (count($matches) > 0) {
preg_match('/ 0) {
$image = $imageTagMatches[1];
} else {
preg_match('/(.+?)[~<]/ui', $matches[1], $imageTagMatches);
if (count($imageTagMatches) > 0) {
$image = $imageTagMatches[1];
} else {
$image = strip_tags($matches[1]);
if (stripos($image, ':') === false) {
$image = str_replace(['{', '}'], '', $image);
$i = stripos($image, '?');
if ($i !== false) {
$image = substr($image, 0, $i);
}
$image = ml($image, '', true, '', false);
}
}
}
$this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')';
$elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext);
}//end if
}//end foreach
/* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color]
[breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */
foreach ($html->find('p') as $elm) {
$i = stripos($elm->innertext, '~~hero-colors');
if ($i !== false) {
$j = strpos($elm->innertext, '~~', ($i + 2));
if ($j !== false) {
if ($j > ($i + 14)) {
$color = substr($elm->innertext, ($i + 14), ($j - $i - 14));
$this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')';
$elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext);
}
break;
}
}
}
/* Hide parts - ~~hide-parts [parts]~~ */
foreach ($html->find('p') as $elm) {
$i = stripos($elm->innertext, '~~hide-parts');
if ($i !== false) {
$j = strpos($elm->innertext, '~~', ($i + 2));
if ($j !== false) {
if ($j > ($i + 13)) {
$parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13)));
$script = '';
foreach ($parts as $part) {
// $part = trim($part);
if (strlen($part) > 0) {
$script .= 'mikio.hidePart(\'' . $part . '\');';
}
}
if (strlen($script) > 0) {
$this->footerScript['hide-parts'] = $script;
}
$elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext);
}
break;
}//end if
}//end if
}//end foreach
/* Page Tags (tag plugin) */
if ($this->getConf('tagsConsolidate') === true) {
$tags = '';
foreach ($html->find('div.tags a') as $elm) {
$tags .= $elm->outertext;
}
foreach ($html->find('div.tags') as $elm) {
$elm->innertext = '';
$elm->setAttribute('style', 'display:none');
}
if (empty($tags) === false) {
$this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')';
}
}
// Configuration Manager
if (strcasecmp($INPUT->str('page'), 'config') === 0) {
// Additional save buttons
foreach ($html->find('#config__manager') as $cm) {
$saveButtons = '';
foreach ($cm->find('p') as $elm) {
$saveButtons = $elm->outertext;
$saveButtons = str_replace('', '
', $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(string $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) === false) {
return true;
}
if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) {
return true;
}
// $meta_file = metaFN($ID, '.meta');
if ($INFO['meta']['user'] === false) {
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 boolean $searchCurrentNS Search the current namespace.
* @param boolean $propagate Propagate search through the namespace.
* @return string URI of the found media file
*/
public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true)
{
global $INFO;
$ext = ['png', 'jpg', 'gif', 'svg'];
if ($searchCurrentNS === true) {
$prefix[] = ':' . $INFO['namespace'] . ':';
}
if ($propagate === true) {
$prefix[] = ':';
$prefix[] = ':wiki:';
}
$theme = $this->getConf('customTheme');
if (empty($theme) === false) {
$prefix[] = 'themes/' . $theme . '/images/';
}
$prefix[] = 'images/';
$search = [];
foreach ($prefix as $pitem) {
foreach ($ext as $eitem) {
$search[] = $pitem . $image . '.' . $eitem;
}
}
$img = '';
$file = '';
$url = '';
$ismedia = false;
$found = false;
foreach ($search as $img) {
if (strcasecmp(substr($img, 0, 1), ':') === 0) {
$file = mediaFN($img);
$ismedia = true;
} else {
$file = tpl_incdir() . $img;
$ismedia = false;
}
if (file_exists($file) === true) {
$found = true;
break;
}
}
if ($found === false) {
return false;
}
if ($ismedia === true) {
$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(string $page = '')
{
global $ID, $conf;
$html = '';
if (empty($page) === true) {
$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(string $type)
{
switch ($type) {
case 'wrench':
return '';
case 'file':
return '';
case 'gear':
return '';
case 'user':
return '';
case 'search':
return '';
case 'home':
return '';
}//end switch
return '';
}
/**
* Finalize theme
*
* @return void
*/
public function finalize()
{
}
/**
* Show Messages
*
* @return void
*/
public function showMessages()
{
global $ACT;
if ($this->lessIgnored === true) {
msg(
'useLESS is enabled on the Mikio template, however is not supported on this server',
2,
'',
'',
MSG_ADMINS_ONLY
);
}
$show = $this->getConf('showNotifications');
if (
strcasecmp($show, 'always') === 0 ||
(strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0)
) {
global $MSG, $MSG_shown;
if (isset($MSG) === false) {
return;
}
if (isset($MSG_shown) === false) {
$MSG_shown = [];
}
foreach ($MSG as $msg) {
$hash = md5($msg['msg']);
if (isset($MSG_shown[$hash]) === true) {
continue;
}
// skip double messages
if (info_msg_allowed($msg) === true) {
echo '
';
echo $msg['msg'];
echo '';
}
$MSG_shown[$hash] = true;
}
unset($GLOBALS['MSG']);
}//end if
}
/**
* Dokuwiki version
*
* @return string the dw version name
*/
public function dwVersion()
{
if (function_exists('getVersionData') === true) {
$version_data = getVersionData();
if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
$version_items = explode(' ', $version_data['date']);
if (count($version_items) >= 2) {
return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1]));
}
}
}
return 'unknown';
}
/**
* Dokuwiki version number
*
* @return string the dw version date converted to integer
*/
public function dwVersionNumber()
{
if (function_exists('getVersionData') === true) {
$version_data = getVersionData();
if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) {
$version_items = explode(' ', $version_data['date']);
if (count($version_items) >= 1) {
return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0])));
}
}
}
return 0;
}
}
global $TEMPLATE;
$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance();