1c165b184SJames Collins<?php 210b40067Snomadjimbob 3c165b184SJames Collins/** 4c165b184SJames Collins * DokuWiki Mikio Template 5c165b184SJames Collins * 6c165b184SJames Collins * @link http://dokuwiki.org/template:mikio 7c165b184SJames Collins * @author James Collins <james.collins@outlook.com.au> 8ab45ba71SJames Collins * @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html) 9c165b184SJames Collins */ 1010b40067Snomadjimbob 11ab45ba71SJames Collinsnamespace dokuwiki\template\mikio; 12c165b184SJames Collins 139cff245bSJames Collinsif (defined('DOKU_INC') === false) { 149cff245bSJames Collins die(); 159cff245bSJames Collins} 16c165b184SJames Collins 17ab45ba71SJames Collinsrequire_once('icons/icons.php'); 18c165b184SJames Collinsrequire_once('inc/simple_html_dom.php'); 19c165b184SJames Collins 2010b40067Snomadjimbobclass Template 2110b40067Snomadjimbob{ 229cff245bSJames Collins /** 239cff245bSJames Collins * @var string Template directory path from local FS. 249cff245bSJames Collins */ 25c165b184SJames Collins public $tplDir = ''; 269cff245bSJames Collins 279cff245bSJames Collins /** 289cff245bSJames Collins * @var string Template directory path from web. 299cff245bSJames Collins */ 30c165b184SJames Collins public $baseDir = ''; 319cff245bSJames Collins 329cff245bSJames Collins /** 339cff245bSJames Collins * @var array Array of Javascript files to include in footer. 349cff245bSJames Collins */ 359cff245bSJames Collins public $footerScript = []; 369cff245bSJames Collins 379cff245bSJames Collins /** 389cff245bSJames Collins * @var boolean Ignore LESS files. 399cff245bSJames Collins */ 40a8df40efSJames Collins public $lessIgnored = false; 41c165b184SJames Collins 42c165b184SJames Collins 43c165b184SJames Collins /** 44c165b184SJames Collins * Class constructor 45c165b184SJames Collins */ 4610b40067Snomadjimbob public function __construct() 4710b40067Snomadjimbob { 48c165b184SJames Collins $this->tplDir = tpl_incdir(); 49c165b184SJames Collins $this->baseDir = tpl_basedir(); 50c165b184SJames Collins 519cff245bSJames Collins $this->registerHooks(); 52c165b184SJames Collins } 53c165b184SJames Collins 54c165b184SJames Collins 55c165b184SJames Collins /** 56ab45ba71SJames Collins * Returns the instance of the class 5747161538SJames Collins * 58ab45ba71SJames Collins * @return Template class instance 5947161538SJames Collins */ 6047161538SJames Collins public static function getInstance() 6147161538SJames Collins { 6247161538SJames Collins static $instance = null; 6347161538SJames Collins 64*3a385f2cSJames Collins if (empty($instance) === true) { 6547161538SJames Collins $instance = new Template(); 6647161538SJames Collins } 6747161538SJames Collins 6847161538SJames Collins return $instance; 6947161538SJames Collins } 7047161538SJames Collins 71ab45ba71SJames Collins 7247161538SJames Collins /** 73ab45ba71SJames Collins * Register the themes hooks into Dokuwiki 749cff245bSJames Collins * 759cff245bSJames Collins * @return void 76c165b184SJames Collins */ 779cff245bSJames Collins private function registerHooks() 7810b40067Snomadjimbob { 79c165b184SJames Collins global $EVENT_HANDLER; 80c165b184SJames Collins 819cff245bSJames Collins $events_dispatcher = [ 82ab45ba71SJames Collins 'TPL_METAHEADER_OUTPUT' => 'metaheadersHandler' 839cff245bSJames Collins ]; 84c165b184SJames Collins 85c165b184SJames Collins foreach ($events_dispatcher as $event => $method) { 86c165b184SJames Collins $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method); 87c165b184SJames Collins } 88c165b184SJames Collins } 89c165b184SJames Collins 90c165b184SJames Collins 91c165b184SJames Collins /** 92ab45ba71SJames Collins * Meta handler hook for DokuWiki 93c165b184SJames Collins * 949cff245bSJames Collins * @param \Doku_Event $event DokuWiki Event. 959cff245bSJames Collins * @return void 96c165b184SJames Collins */ 9710b40067Snomadjimbob public function metaHeadersHandler(\Doku_Event $event) 9810b40067Snomadjimbob { 99ab45ba71SJames Collins global $MIKIO_ICONS; 100b5536b07SChris MacMackin global $conf; 101ab45ba71SJames Collins 1029cff245bSJames Collins $this->includePage('theme', false, true); 103a8eebd82SJames Collins 1049cff245bSJames Collins $stylesheets = []; 1059cff245bSJames Collins $scripts = []; 106c165b184SJames Collins 107*3a385f2cSJames Collins if (empty($this->getConf('customTheme')) === false) { 1089cff245bSJames Collins if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) { 109a8eebd82SJames Collins $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less'; 110a8eebd82SJames Collins } else { 1119cff245bSJames Collins if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) { 112ab45ba71SJames Collins $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css'; 1132b4583abSJames Collins } 114a8eebd82SJames Collins } 1159cff245bSJames Collins if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) { 116ab45ba71SJames Collins $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js'; 117c165b184SJames Collins } 118c165b184SJames Collins } 119c165b184SJames Collins 120*3a385f2cSJames Collins if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) { 1219cff245bSJames Collins $icons = []; 122ab45ba71SJames Collins foreach ($MIKIO_ICONS as $icon) { 1239cff245bSJames Collins if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) { 124ab45ba71SJames Collins $icons[] = $icon; 125c165b184SJames Collins 126*3a385f2cSJames Collins if (empty($icon['css']) === false) { 1279cff245bSJames Collins if (strpos($icon['css'], '//') === false) { 128a8eebd82SJames Collins $stylesheets[] = $this->baseDir . 'icons/' . $icon['css']; 129ab45ba71SJames Collins } else { 130a8eebd82SJames Collins $stylesheets[] = $icon['css']; 131ab45ba71SJames Collins } 132ab45ba71SJames Collins } 133ab45ba71SJames Collins } 134ab45ba71SJames Collins } 135ab45ba71SJames Collins $MIKIO_ICONS = $icons; 136ab45ba71SJames Collins } else { 137ab45ba71SJames Collins $MIKIO_ICONS = []; 138ab45ba71SJames Collins } 139c165b184SJames Collins 1407864545bSChris MacMackin $scripts[] = $this->baseDir . 'assets/mikio-typeahead.js'; 141ab45ba71SJames Collins $scripts[] = $this->baseDir . 'assets/mikio.js'; 142644fd9f9SJames Collins 1439cff245bSJames Collins if ($this->getConf('useLESS') === true) { 144ab45ba71SJames Collins $stylesheets[] = $this->baseDir . 'assets/mikio.less'; 145644fd9f9SJames Collins } else { 146644fd9f9SJames Collins $stylesheets[] = $this->baseDir . 'assets/mikio.css'; 147644fd9f9SJames Collins } 148644fd9f9SJames Collins 149ab45ba71SJames Collins 150ab45ba71SJames Collins $set = []; 151c165b184SJames Collins foreach ($stylesheets as $style) { 1529cff245bSJames Collins if (in_array($style, $set) === false) { 153*3a385f2cSJames Collins if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) { 154ab45ba71SJames Collins $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style); 155ab45ba71SJames Collins } 156ab45ba71SJames Collins 1579cff245bSJames Collins array_unshift($event->data['link'], [ 158c165b184SJames Collins 'type' => 'text/css', 159c165b184SJames Collins 'rel' => 'stylesheet', 160c165b184SJames Collins 'href' => $style 1619cff245bSJames Collins ]); 162c165b184SJames Collins } 163ab45ba71SJames Collins $set[] = $style; 164ab45ba71SJames Collins } 165c165b184SJames Collins 166ab45ba71SJames Collins $set = []; 167c165b184SJames Collins foreach ($scripts as $script) { 1689cff245bSJames Collins if (in_array($script, $set) === false) { 1699cff245bSJames Collins $script_params = [ 170c165b184SJames Collins 'type' => 'text/javascript', 171c165b184SJames Collins '_data' => '', 1728395cdcbSChris MacMackin 'src' => $script 1739cff245bSJames Collins ]; 174c1ecb866SJames Collins 175c1ecb866SJames Collins // equal to or greator than hogfather 176c1ecb866SJames Collins if ($this->dwVersionNumber() >= 20200729) { 177c1ecb866SJames Collins // greator than hogfather - defer always on 178c1ecb866SJames Collins if ($this->dwVersionNumber() >= 20200729) { 179c1ecb866SJames Collins $script_params += ['defer' => 'defer']; 180c1ecb866SJames Collins } else { 181c1ecb866SJames Collins // hogfather - defer always on unless $conf['defer_js'] is false 1829cff245bSJames Collins if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) { 1838395cdcbSChris MacMackin $script_params += ['defer' => 'defer']; 1848395cdcbSChris MacMackin } 185c1ecb866SJames Collins } 186c1ecb866SJames Collins } 187c1ecb866SJames Collins 1888395cdcbSChris MacMackin $event->data['script'][] = $script_params; 1899cff245bSJames Collins }//end if 190ab45ba71SJames Collins $set[] = $script; 1919cff245bSJames Collins }//end foreach 192c165b184SJames Collins } 193c165b184SJames Collins 194c165b184SJames Collins 195c165b184SJames Collins /** 196a8eebd82SJames Collins * Print or return the footer meta data 197c165b184SJames Collins * 1989cff245bSJames Collins * @param boolean $print Print the data to buffer. 1999cff245bSJames Collins * @return string HTML footer meta data 200c165b184SJames Collins */ 2019cff245bSJames Collins public function includeFooterMeta(bool $print = true) 20210b40067Snomadjimbob { 203a8eebd82SJames Collins $html = ''; 204a8eebd82SJames Collins 205a8eebd82SJames Collins if (count($this->footerScript) > 0) { 206a8eebd82SJames Collins $html .= '<script type="text/javascript">function mikioFooterRun() {'; 207a8eebd82SJames Collins foreach ($this->footerScript as $script) { 208a8eebd82SJames Collins $html .= $script . ';'; 209a8eebd82SJames Collins } 210a8eebd82SJames Collins $html .= '}</script>'; 211a8eebd82SJames Collins } 212c165b184SJames Collins 213c165b184SJames Collins 2149cff245bSJames Collins if ($print === true) { 2159cff245bSJames Collins echo $html; 2169cff245bSJames Collins } 217a8eebd82SJames Collins return $html; 218a8eebd82SJames Collins } 219a8eebd82SJames Collins 220a8eebd82SJames Collins /** 221ab45ba71SJames Collins * Retreive and parse theme configuration options 222c165b184SJames Collins * 2239cff245bSJames Collins * @param string $key The configuration key to retreive. 2249cff245bSJames Collins * @param mixed $default If key doesn't exist, return this value. 225ab45ba71SJames Collins * @return mixed parsed value of configuration 226c165b184SJames Collins */ 2279cff245bSJames Collins public function getConf(string $key, mixed $default = false) 22810b40067Snomadjimbob { 229c165b184SJames Collins $value = tpl_getConf($key, $default); 230c165b184SJames Collins 231*3a385f2cSJames Collins $data = [ 232*3a385f2cSJames Collins ['keys' => ['navbarDWMenuType'], 'type' => 'choice', 233*3a385f2cSJames Collins 'values' => ['both', 'icons', 'text'] 234*3a385f2cSJames Collins ], 235*3a385f2cSJames Collins ['keys' => ['navbarDWMenuCombine'], 'type' => 'choice', 236*3a385f2cSJames Collins 'values' => ['combine', 'seperate', 'dropdown'] 237*3a385f2cSJames Collins ], 238*3a385f2cSJames Collins ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'], 239*3a385f2cSJames Collins 'type' => 'choice', 240*3a385f2cSJames Collins 'values' => ['none', 'custom', 'search', 'dokuwiki'], 241*3a385f2cSJames Collins 'default' => [ 242*3a385f2cSJames Collins 'navbarPosLeft' => 'none', 243*3a385f2cSJames Collins 'navbarPosMiddle' => 'search', 244*3a385f2cSJames Collins 'navbarPosRight' => 'dokuwiki' 245*3a385f2cSJames Collins ] 246*3a385f2cSJames Collins ], 247*3a385f2cSJames Collins ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink', 248*3a385f2cSJames Collins 'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile', 249*3a385f2cSJames Collins 'navbarItemShowAdmin' 250*3a385f2cSJames Collins ], 251*3a385f2cSJames Collins 'type' => 'choice', 252*3a385f2cSJames Collins 'values' => ['always', 'logged in', 'logged out', 'never'] 253*3a385f2cSJames Collins ], 254*3a385f2cSJames Collins ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'], 255*3a385f2cSJames Collins 'type' => 'choice', 256*3a385f2cSJames Collins 'values' => ['always', 'never'] 257*3a385f2cSJames Collins ], 258*3a385f2cSJames Collins ['keys' => ['searchButton'], 'type' => 'choice', 259*3a385f2cSJames Collins 'values' => ['icon', 'text'] 260*3a385f2cSJames Collins ], 261*3a385f2cSJames Collins ['keys' => ['breadcrumbPosition', 'youareherePosition'], 262*3a385f2cSJames Collins 'type' => 'choice', 263*3a385f2cSJames Collins 'values' => ['top', 'hero', 'page', 'none'] 264*3a385f2cSJames Collins ], 265*3a385f2cSJames Collins ['keys' => ['youarehereHome'], 'type' => 'choice', 266*3a385f2cSJames Collins 'values' => ['page title', 'home', 'icon', 'none'] 267*3a385f2cSJames Collins ], 268*3a385f2cSJames Collins ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'], 269*3a385f2cSJames Collins 'type' => 'choice', 270*3a385f2cSJames Collins 'values' => ['none', 'logged in user', 'search', 'content', 'tags'], 271*3a385f2cSJames Collins 'default' => [ 272*3a385f2cSJames Collins 'sidebarLeftRow1' => 'logged in user', 273*3a385f2cSJames Collins 'sidebarLeftRow2' => 'search', 274*3a385f2cSJames Collins 'sidebarLeftRow3' => 'content' 275*3a385f2cSJames Collins ] 276*3a385f2cSJames Collins ], 277*3a385f2cSJames Collins ['keys' => ['pageToolsFloating', 'pageToolsFooter'], 278*3a385f2cSJames Collins 'type' => 'choice', 279*3a385f2cSJames Collins 'values' => ['always', 'none', 'page editors'] 280*3a385f2cSJames Collins ], 281*3a385f2cSJames Collins ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink', 282*3a385f2cSJames Collins 'pageToolsShowTop' 283*3a385f2cSJames Collins ], 284*3a385f2cSJames Collins 'type' => 'choice', 285*3a385f2cSJames Collins 'values' => ['always', 'logged in', 'logged out', 'never'] 286*3a385f2cSJames Collins ], 287*3a385f2cSJames Collins ['keys' => ['showNotifications'], 'type' => 'choice', 288*3a385f2cSJames Collins 'values' => ['admin', 'always', 'none'] 289*3a385f2cSJames Collins ], 290*3a385f2cSJames Collins ['keys' => ['licenseType'], 'type' => 'choice', 291*3a385f2cSJames Collins 'values' => ['badge', 'button', 'none'] 292*3a385f2cSJames Collins ], 293*3a385f2cSJames Collins ['keys' => ['navbarUseTitleIcon'], 'type' => 'bool'], 294*3a385f2cSJames Collins ['keys' => ['navbarUseTitleText'], 'type' => 'bool'], 295*3a385f2cSJames Collins ['keys' => ['navbarUseTaglineText'], 'type' => 'bool'], 296*3a385f2cSJames Collins ['keys' => ['navbarShowSub'], 'type' => 'bool'], 297*3a385f2cSJames Collins ['keys' => ['heroTitle'], 'type' => 'bool'], 298*3a385f2cSJames Collins ['keys' => ['heroImagePropagation'], 'type' => 'bool'], 299*3a385f2cSJames Collins ['keys' => ['breadcrumbPrefix'], 'type' => 'bool'], 300*3a385f2cSJames Collins ['keys' => ['breadcrumbSep'], 'type' => 'bool'], 301*3a385f2cSJames Collins ['keys' => ['youareherePrefix'], 'type' => 'bool'], 302*3a385f2cSJames Collins ['keys' => ['youarehereSep'], 'type' => 'bool'], 303*3a385f2cSJames Collins ['keys' => ['sidebarShowLeft'], 'type' => 'bool'], 304*3a385f2cSJames Collins ['keys' => ['sidebarShowRight'], 'type' => 'bool'], 305*3a385f2cSJames Collins ['keys' => ['tocFull'], 'type' => 'bool'], 306*3a385f2cSJames Collins ['keys' => ['footerSearch'], 'type' => 'bool'], 307*3a385f2cSJames Collins ['keys' => ['licenseImageOnly'], 'type' => 'bool'], 308*3a385f2cSJames Collins ['keys' => ['includePageUseACL'], 'type' => 'bool'], 309*3a385f2cSJames Collins ['keys' => ['includePagePropagate'], 'type' => 'bool'], 310*3a385f2cSJames Collins ['keys' => ['youarehereHideHome'], 'type' => 'bool'], 311*3a385f2cSJames Collins ['keys' => ['tagsConsolidate'], 'type' => 'bool'], 312*3a385f2cSJames Collins ['keys' => ['footerInPage'], 'type' => 'bool'], 313*3a385f2cSJames Collins ['keys' => ['sidebarMobileDefaultCollapse'], 'type' => 'bool'], 314*3a385f2cSJames Collins ['keys' => ['sidebarAlwaysShowLeft'], 'type' => 'bool'], 315*3a385f2cSJames Collins ['keys' => ['sidebarAlwaysShowRight'], 'type' => 'bool'], 316*3a385f2cSJames Collins ['keys' => ['searchUseTypeahead'], 'type' => 'bool'], 317*3a385f2cSJames Collins ['keys' => ['youarehereShowLast'], 'type' => 'int'], 318*3a385f2cSJames Collins 319*3a385f2cSJames Collins ['keys' => ['iconTag'], 'type' => 'string'], 320*3a385f2cSJames Collins ['keys' => ['customTheme'], 'type' => 'string'], 321*3a385f2cSJames Collins ['keys' => ['navbarCustomMenuText'], 'type' => 'string'], 322*3a385f2cSJames Collins ['keys' => ['breadcrumbPrefixText'], 'type' => 'string'], 323*3a385f2cSJames Collins ['keys' => ['breadcrumbSepText'], 'type' => 'string'], 324*3a385f2cSJames Collins ['keys' => ['youareherePrefixText'], 'type' => 'string'], 325*3a385f2cSJames Collins ['keys' => ['youarehereSepText'], 'type' => 'string'], 326*3a385f2cSJames Collins ['keys' => ['footerCustomMenuText'], 'type' => 'string'], 327*3a385f2cSJames Collins ['keys' => ['brandURLGuest'], 'type' => 'string'], 328*3a385f2cSJames Collins ['keys' => ['brandURLUser'], 'type' => 'string'], 329*3a385f2cSJames Collins 330*3a385f2cSJames Collins ['keys' => ['useLESS'], 'type' => 'less'], 331*3a385f2cSJames Collins ]; 332*3a385f2cSJames Collins 333*3a385f2cSJames Collins foreach ($data as $row) { 334*3a385f2cSJames Collins // does not check case.... 335*3a385f2cSJames Collins if (in_array($key, $row['keys']) === true) { 336*3a385f2cSJames Collins if (array_key_exists('type', 'row') === true) { 337*3a385f2cSJames Collins switch ($row['type']) { 338*3a385f2cSJames Collins case 'bool': 339*3a385f2cSJames Collins return (bool) $value; 340*3a385f2cSJames Collins case 'int': 341*3a385f2cSJames Collins return (int) $value; 342*3a385f2cSJames Collins case 'string': 343*3a385f2cSJames Collins return $value; 344*3a385f2cSJames Collins case 'less': 34529118ed7SJames Collins $value = (bool) $value; 346a8df40efSJames Collins $lessAvailable = true; 347a8df40efSJames Collins 348a8df40efSJames Collins // check for less library 349a8df40efSJames Collins $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3509cff245bSJames Collins if (file_exists($lesscLib) === false) { 351a8df40efSJames Collins $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3529cff245bSJames Collins } 3539cff245bSJames Collins if (file_exists($lesscLib) === false) { 354a8df40efSJames Collins $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3559cff245bSJames Collins } 3569cff245bSJames Collins if (file_exists($lesscLib) === false) { 3579cff245bSJames Collins $lesscLib = $_SERVER['DOCUMENT_ROOT'] . 3589cff245bSJames Collins '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3599cff245bSJames Collins } 3609cff245bSJames Collins if (file_exists($lesscLib) === false) { 361a8df40efSJames Collins $lessAvailable = false; 362a8df40efSJames Collins } 363a8df40efSJames Collins 364a8df40efSJames Collins // check for ctype extensions 3659cff245bSJames Collins if (function_exists('ctype_digit') === false) { 366a8df40efSJames Collins $lessAvailable = false; 367a8df40efSJames Collins } 368a8df40efSJames Collins 3699cff245bSJames Collins if ($value === true && $lessAvailable === false) { 370a8df40efSJames Collins $this->lessIgnored = true; 37129118ed7SJames Collins $value = false; 37229118ed7SJames Collins } 373*3a385f2cSJames Collins 374*3a385f2cSJames Collins return $value; 3759cff245bSJames Collins }//end switch 376*3a385f2cSJames Collins }//end if 377*3a385f2cSJames Collins 378*3a385f2cSJames Collins if (in_array($value, $row['values']) === true) { 379*3a385f2cSJames Collins return $value; 380*3a385f2cSJames Collins } 381*3a385f2cSJames Collins 382*3a385f2cSJames Collins if (array_key_exists('default', $row) === true) { 383*3a385f2cSJames Collins if (is_array($row['default']) === true) { 384*3a385f2cSJames Collins if (array_key_exists($key, $row['default']) === true) { 385*3a385f2cSJames Collins return $row['default'][$key]; 386*3a385f2cSJames Collins } 387*3a385f2cSJames Collins } else { 388*3a385f2cSJames Collins return $row['default']; 389*3a385f2cSJames Collins } 390*3a385f2cSJames Collins } 391*3a385f2cSJames Collins 392*3a385f2cSJames Collins return reset($row['values']); 393*3a385f2cSJames Collins }//end if 394*3a385f2cSJames Collins }//end foreach 395c165b184SJames Collins 396c165b184SJames Collins return $value; 397c165b184SJames Collins } 398c165b184SJames Collins 399c165b184SJames Collins 400c165b184SJames Collins /** 401a8eebd82SJames Collins * Check if a page exist in directory or namespace 402c165b184SJames Collins * 4039cff245bSJames Collins * @param string $page Page/namespace to search. 404a8eebd82SJames Collins * @return boolean if page exists 405c165b184SJames Collins */ 4069cff245bSJames Collins public function pageExists(string $page) 40710b40067Snomadjimbob { 408ab45ba71SJames Collins ob_start(); 409a8eebd82SJames Collins tpl_includeFile($page . '.html'); 410ab45ba71SJames Collins $html = ob_get_contents(); 411ab45ba71SJames Collins ob_end_clean(); 412a8eebd82SJames Collins 413*3a385f2cSJames Collins if (empty($html) === false) { 4149cff245bSJames Collins return true; 4159cff245bSJames Collins } 416a8eebd82SJames Collins 417a8eebd82SJames Collins $useACL = $this->getConf('includePageUseACL'); 418a8eebd82SJames Collins $propagate = $this->getConf('includePagePropagate'); 419a8eebd82SJames Collins 4209cff245bSJames Collins if ($propagate === true) { 4219cff245bSJames Collins if (page_findnearest($page, $useACL) !== false) { 4229cff245bSJames Collins return true; 4239cff245bSJames Collins } 4249cff245bSJames Collins } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) { 4259cff245bSJames Collins return true; 426ab45ba71SJames Collins } 427ab45ba71SJames Collins 4289cff245bSJames Collins return false; 429ab45ba71SJames Collins } 430ab45ba71SJames Collins 431a8eebd82SJames Collins 432c165b184SJames Collins /** 433a8eebd82SJames Collins * Print or return page from directory or namespace 4342b4583abSJames Collins * 4359cff245bSJames Collins * @param string $page Page/namespace to include. 4369cff245bSJames Collins * @param boolean $print Print content. 4379cff245bSJames Collins * @param boolean $parse Parse content before printing/returning. 4389cff245bSJames Collins * @param string $classWrapper Wrap page in a div with class. 439ab45ba71SJames Collins * @return string contents of page found 4402b4583abSJames Collins */ 4419cff245bSJames Collins public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '') 4422b4583abSJames Collins { 443a8eebd82SJames Collins ob_start(); 444a8eebd82SJames Collins tpl_includeFile($page . '.html'); 445a8eebd82SJames Collins $html = ob_get_contents(); 446a8eebd82SJames Collins ob_end_clean(); 447a8eebd82SJames Collins 448*3a385f2cSJames Collins if (empty($html) === true) { 449a8eebd82SJames Collins $useACL = $this->getConf('includePageUseACL'); 450a8eebd82SJames Collins $propagate = $this->getConf('includePagePropagate'); 451ab45ba71SJames Collins $html = ''; 4522b4583abSJames Collins 453ab45ba71SJames Collins $html = tpl_include_page($page, false, $propagate, $useACL); 454ab45ba71SJames Collins } 4552b4583abSJames Collins 456*3a385f2cSJames Collins if (empty($html) === false && $parse === true) { 457ab45ba71SJames Collins $html = $this->parseContent($html); 458ab45ba71SJames Collins } 4592b4583abSJames Collins 460*3a385f2cSJames Collins if (empty($classWrapper) === false && empty($html) === false) { 4619cff245bSJames Collins $html = '<div class="' . $classWrapper . '">' . $html . '</div>'; 4629cff245bSJames Collins } 4632b4583abSJames Collins 4649cff245bSJames Collins if ($print === true) { 4659cff245bSJames Collins echo $html; 4669cff245bSJames Collins } 467ab45ba71SJames Collins return $html; 4682b4583abSJames Collins } 4692b4583abSJames Collins 470a8eebd82SJames Collins 471a8eebd82SJames Collins /** 472a8eebd82SJames Collins * Print or return logged in user information 473a8eebd82SJames Collins * 4749cff245bSJames Collins * @param boolean $print Print content. 475a8eebd82SJames Collins * @return string user information 476a8eebd82SJames Collins */ 4779cff245bSJames Collins public function includeLoggedIn(bool $print = true) 47810b40067Snomadjimbob { 479a8eebd82SJames Collins $html = ''; 480a8eebd82SJames Collins 4819cff245bSJames Collins if (empty($_SERVER['REMOTE_USER']) === false) { 482a8eebd82SJames Collins $html .= '<div class="mikio-user-info">'; 483a8eebd82SJames Collins ob_start(); 484a8eebd82SJames Collins tpl_userinfo(); 485a8eebd82SJames Collins $html .= ob_get_contents(); 486a8eebd82SJames Collins ob_end_clean(); 487a8eebd82SJames Collins $html .= '</div>'; 4882b4583abSJames Collins } 489a8eebd82SJames Collins 4909cff245bSJames Collins if ($print === true) { 4919cff245bSJames Collins echo $html; 4929cff245bSJames Collins } 493a8eebd82SJames Collins return $html; 4942b4583abSJames Collins } 4952b4583abSJames Collins 4962b4583abSJames Collins 497a8eebd82SJames Collins /** 498a8eebd82SJames Collins * Print or return DokuWiki Menu 499a8eebd82SJames Collins * 5009cff245bSJames Collins * @param boolean $print Print content. 501a8eebd82SJames Collins * @return string contents of the menu 502a8eebd82SJames Collins */ 5039cff245bSJames Collins public function includeDWMenu(bool $print = true) 50410b40067Snomadjimbob { 5052b4583abSJames Collins global $lang; 5062b4583abSJames Collins global $USERINFO; 507c165b184SJames Collins 5089cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 509a8eebd82SJames Collins $html = '<ul class="mikio-nav">'; 5102b4583abSJames Collins 511ab45ba71SJames Collins $pageToolsMenu = []; 512ab45ba71SJames Collins $siteToolsMenu = []; 513ab45ba71SJames Collins $userToolsMenu = []; 514c165b184SJames Collins 515ab45ba71SJames Collins $showIcons = ($this->getConf('navbarDWMenuType') != 'text'); 516ab45ba71SJames Collins $showText = ($this->getConf('navbarDWMenuType') != 'icons'); 517ab45ba71SJames Collins $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate'); 5182b4583abSJames Collins 5192b4583abSJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 5202b4583abSJames Collins foreach ($items as $item) { 5219cff245bSJames Collins if ($item->getType() !== 'top') { 522ab45ba71SJames Collins $itemHtml = ''; 5232b4583abSJames Collins 524905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5259cff245bSJames Collins if ( 526*3a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 527*3a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 528*3a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5299cff245bSJames Collins ) { 5309cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . 5319cff245bSJames Collins ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 5329cff245bSJames Collins if ($showIcons === true) { 5339cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 5349cff245bSJames Collins } 5359cff245bSJames Collins if ($showText === true || $isDropDown === true) { 5369cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 5379cff245bSJames Collins } 538ab45ba71SJames Collins $itemHtml .= '</a>'; 539ab45ba71SJames Collins 540ab45ba71SJames Collins $pageToolsMenu[] = $itemHtml; 5412b4583abSJames Collins } 5429cff245bSJames Collins }//end if 5439cff245bSJames Collins }//end foreach 5442b4583abSJames Collins 545ab45ba71SJames Collins $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action'); 546ab45ba71SJames Collins foreach ($items as $item) { 547ab45ba71SJames Collins $itemHtml = ''; 5482b4583abSJames Collins 549905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5509cff245bSJames Collins if ( 551*3a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 552*3a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 553*3a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5549cff245bSJames Collins ) { 5559cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' . 5569cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 5579cff245bSJames Collins if ($showIcons === true) { 5589cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 5599cff245bSJames Collins } 5609cff245bSJames Collins if ($showText === true || $isDropDown === true) { 5619cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 5629cff245bSJames Collins } 563ab45ba71SJames Collins $itemHtml .= '</a>'; 5642b4583abSJames Collins 565ab45ba71SJames Collins $siteToolsMenu[] = $itemHtml; 5662b4583abSJames Collins } 5679cff245bSJames Collins }//end foreach 5682b4583abSJames Collins 569ab45ba71SJames Collins $items = (new \dokuwiki\Menu\UserMenu())->getItems('action'); 570ab45ba71SJames Collins foreach ($items as $item) { 571ab45ba71SJames Collins $itemHtml = ''; 572ab45ba71SJames Collins 573905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5749cff245bSJames Collins if ( 575*3a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 576*3a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 577*3a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5789cff245bSJames Collins ) { 5799cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' . 5809cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 5819cff245bSJames Collins if ($showIcons === true) { 5829cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 5839cff245bSJames Collins } 5849cff245bSJames Collins if ($showText === true || $isDropDown === true) { 5859cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 5869cff245bSJames Collins } 587ab45ba71SJames Collins $itemHtml .= '</a>'; 588ab45ba71SJames Collins 589ab45ba71SJames Collins $userToolsMenu[] = $itemHtml; 590ab45ba71SJames Collins } 5919cff245bSJames Collins }//end foreach 592ab45ba71SJames Collins 593ab45ba71SJames Collins 594ab45ba71SJames Collins switch ($this->getConf('navbarDWMenuCombine')) { 595ab45ba71SJames Collins case 'dropdown': 596ab45ba71SJames Collins $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">'; 5979cff245bSJames Collins $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button" 5989cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 5999cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('file') : '') . 6009cff245bSJames Collins ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] . 6019cff245bSJames Collins '</span>') . '</a>'; 602a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 603ab45ba71SJames Collins 604ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 605ab45ba71SJames Collins $html .= $item; 606ab45ba71SJames Collins } 607ab45ba71SJames Collins 608ab45ba71SJames Collins $html .= '</div>'; 609ab45ba71SJames Collins $html .= '</li>'; 610ab45ba71SJames Collins 611a8eebd82SJames Collins $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">'; 6129cff245bSJames Collins $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button" 6139cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6149cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('gear') : '') . 6159cff245bSJames Collins ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' . 6169cff245bSJames Collins $lang['site_tools'] . '</span>') . '</a>'; 617a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 618ab45ba71SJames Collins 619ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 620ab45ba71SJames Collins $html .= $item; 621ab45ba71SJames Collins } 622ab45ba71SJames Collins 623ab45ba71SJames Collins $html .= '</div>'; 624ab45ba71SJames Collins $html .= '</li>'; 625ab45ba71SJames Collins 626a8eebd82SJames Collins $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">'; 6279cff245bSJames Collins $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button" 6289cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6299cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('user') : '') . 6309cff245bSJames Collins ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' . 6319cff245bSJames Collins $lang['user_tools'] . '</span>') . '</a>'; 632a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 633ab45ba71SJames Collins 634ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 635ab45ba71SJames Collins $html .= $item; 636ab45ba71SJames Collins } 637ab45ba71SJames Collins 638ab45ba71SJames Collins $html .= '</div>'; 639ab45ba71SJames Collins $html .= '</li>'; 640ab45ba71SJames Collins 641ab45ba71SJames Collins break; 642ab45ba71SJames Collins 643ab45ba71SJames Collins case 'combine': 644ab45ba71SJames Collins $html .= '<li class="mikio-nav-dropdown">'; 6459cff245bSJames Collins $html .= '<a class="mikio-nav-link" href="#">' . 6469cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') . 6479cff245bSJames Collins ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' . 6489cff245bSJames Collins tpl_getLang('tools-menu') . '</span>') . '</a>'; 649a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 650ab45ba71SJames Collins 651ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>'; 652ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 653ab45ba71SJames Collins $html .= $item; 654ab45ba71SJames Collins } 655ab45ba71SJames Collins 656ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 657ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>'; 658ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 659ab45ba71SJames Collins $html .= $item; 660ab45ba71SJames Collins } 661ab45ba71SJames Collins 662ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 663ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>'; 664ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 665ab45ba71SJames Collins $html .= $item; 666ab45ba71SJames Collins } 667ab45ba71SJames Collins 668ab45ba71SJames Collins $html .= '</div>'; 669ab45ba71SJames Collins $html .= '</li>'; 670ab45ba71SJames Collins break; 671ab45ba71SJames Collins 672ab45ba71SJames Collins default: // seperate 673ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 674a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 675ab45ba71SJames Collins } 676ab45ba71SJames Collins 677ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 678a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 679a8eebd82SJames Collins } 680a8eebd82SJames Collins 681a8eebd82SJames Collins foreach ($userToolsMenu as $item) { 682a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 683ab45ba71SJames Collins } 684ab45ba71SJames Collins 685ab45ba71SJames Collins break; 6869cff245bSJames Collins }//end switch 687ab45ba71SJames Collins 688ab45ba71SJames Collins $html .= '</ul>'; 689ab45ba71SJames Collins 6909cff245bSJames Collins if ($print === true) { 6919cff245bSJames Collins echo $html; 6929cff245bSJames Collins } 693a8eebd82SJames Collins return $html; 694a8eebd82SJames Collins } 695a8eebd82SJames Collins 696a8eebd82SJames Collins 697a8eebd82SJames Collins /** 698a8eebd82SJames Collins * Create a nav element from a string. <uri>|<title>; 699a8eebd82SJames Collins * 7009cff245bSJames Collins * @param string $str String to generate nav. 701a8eebd82SJames Collins * @return string nav elements generated 702a8eebd82SJames Collins */ 7039cff245bSJames Collins public function stringToNav(string $str) 70410b40067Snomadjimbob { 705a8eebd82SJames Collins $html = ''; 706a8eebd82SJames Collins 707*3a385f2cSJames Collins if (empty($str) === false) { 708a8eebd82SJames Collins $items = explode(';', $str); 709a8eebd82SJames Collins if (count($items) > 0) { 710a8eebd82SJames Collins $html .= '<ul class="mikio-nav">'; 711a8eebd82SJames Collins foreach ($items as $item) { 712a8eebd82SJames Collins $parts = explode('|', $item); 713a8eebd82SJames Collins if ($parts > 1) { 7149cff245bSJames Collins $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' . 7159cff245bSJames Collins strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) . 7169cff245bSJames Collins '</a></li>'; 717a8eebd82SJames Collins } 718a8eebd82SJames Collins } 719a8eebd82SJames Collins $html .= '</ul>'; 720a8eebd82SJames Collins } 7212b4583abSJames Collins } 7222b4583abSJames Collins 723ab45ba71SJames Collins return $html; 7242b4583abSJames Collins } 7252b4583abSJames Collins 726a8eebd82SJames Collins /** 727ab45ba71SJames Collins * print or return the main navbar 7282b4583abSJames Collins * 7299cff245bSJames Collins * @param boolean $print Print the navbar. 7309cff245bSJames Collins * @param boolean $showSub Include the sub navbar. 731ab45ba71SJames Collins * @return string generated content 7322b4583abSJames Collins */ 7339cff245bSJames Collins public function includeNavbar(bool $print = true, bool $showSub = false) 73410b40067Snomadjimbob { 735b39ad16dSJames Collins global $conf, $USERINFO; 736d3d7d2b7SJames Collins 737d3d7d2b7SJames Collins $homeUrl = wl(); 738d3d7d2b7SJames Collins 7399cff245bSJames Collins if (plugin_isdisabled('showpageafterlogin') === false) { 740d3d7d2b7SJames Collins $p = &plugin_load('action', 'showpageafterlogin'); 741*3a385f2cSJames Collins if (empty($p) === false) { 7429cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 743d3d7d2b7SJames Collins $homeUrl = wl($p->getConf('page_after_login')); 744d3d7d2b7SJames Collins } 745d3d7d2b7SJames Collins } 746b39ad16dSJames Collins } else { 7479cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 748b39ad16dSJames Collins $url = $this->getConf('brandURLUser'); 749b39ad16dSJames Collins if (strlen($url) > 0) { 750b39ad16dSJames Collins $homeUrl = $url; 751d3d7d2b7SJames Collins } 752b39ad16dSJames Collins } else { 753b39ad16dSJames Collins $url = $this->getConf('brandURLGuest'); 754b39ad16dSJames Collins if (strlen($url) > 0) { 755b39ad16dSJames Collins $homeUrl = $url; 756b39ad16dSJames Collins } 757b39ad16dSJames Collins } 758b39ad16dSJames Collins } 759d3d7d2b7SJames Collins 760ab45ba71SJames Collins $html = ''; 76147161538SJames Collins 7629cff245bSJames Collins $html .= '<nav class="mikio-navbar' . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') . 7639cff245bSJames Collins '">'; 764f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 765d3d7d2b7SJames Collins $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">'; 7669cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) { 767ab45ba71SJames Collins // Brand image 7689cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true) { 7699cff245bSJames Collins $logo = $this->getMediaFile('logo', false); 7709cff245bSJames Collins ; 771*3a385f2cSJames Collins if (empty($logo) === false) { 772f0241fc4SJames Collins $width = $this->getConf('navbarTitleIconWidth'); 773f0241fc4SJames Collins $height = $this->getConf('navbarTitleIconHeight'); 774f0241fc4SJames Collins $styles = ''; 775f0241fc4SJames Collins 776f0241fc4SJames Collins if (strlen($width) > 0 || strlen($height) > 0) { 7779cff245bSJames Collins if (ctype_digit($width) === true) { 778f0241fc4SJames Collins $styles .= 'max-width:' . intval($width) . 'px;'; 7799cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) { 780f0241fc4SJames Collins $styles .= 'max-width:' . $width . ';'; 7819cff245bSJames Collins } elseif (strcasecmp($width, 'none') === 0) { 7827a92c19bSJames Collins $styles .= 'max-width:none;'; 783f0241fc4SJames Collins } 784f0241fc4SJames Collins 7859cff245bSJames Collins if (ctype_digit($height) === true) { 786f0241fc4SJames Collins $styles .= 'max-height:' . intval($height) . 'px;'; 7879cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) { 788f0241fc4SJames Collins $styles .= 'max-height:' . $height . ';'; 7899cff245bSJames Collins } elseif (strcasecmp($height, 'none') === 0) { 7907a92c19bSJames Collins $styles .= 'max-height:none;'; 791f0241fc4SJames Collins } 792f0241fc4SJames Collins 793f0241fc4SJames Collins if (strlen($styles) > 0) { 794f0241fc4SJames Collins $styles = ' style="' . $styles . '"'; 795f0241fc4SJames Collins } 7969cff245bSJames Collins }//end if 797f0241fc4SJames Collins 798f0241fc4SJames Collins $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>'; 7999cff245bSJames Collins }//end if 8009cff245bSJames Collins }//end if 801ab45ba71SJames Collins 802ab45ba71SJames Collins // Brand title 8039cff245bSJames Collins if ($this->getConf('navbarUseTitleText') === true) { 804ab45ba71SJames Collins $html .= '<div class="mikio-navbar-brand-title">'; 805a8eebd82SJames Collins $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>'; 8069cff245bSJames Collins if ($this->getConf('navbarUseTaglineText') === true) { 807a8eebd82SJames Collins $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>'; 808ab45ba71SJames Collins } 809ab45ba71SJames Collins $html .= '</div>'; 810ab45ba71SJames Collins } 8119cff245bSJames Collins }//end if 812ab45ba71SJames Collins $html .= '</a>'; 813660b2c71SJames Collins $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>'; 814ab45ba71SJames Collins 815ab45ba71SJames Collins // Menus 816ab45ba71SJames Collins $html .= '<div class="mikio-navbar-collapse">'; 817ab45ba71SJames Collins 8189cff245bSJames Collins $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'), 8199cff245bSJames Collins $this->getConf('navbarPosRight', 'none') 8209cff245bSJames Collins ]; 821a8eebd82SJames Collins foreach ($menus as $menuType) { 822a8eebd82SJames Collins switch ($menuType) { 823a8eebd82SJames Collins case 'custom': 824a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', '')); 825a8eebd82SJames Collins break; 826a8eebd82SJames Collins case 'search': 827ab45ba71SJames Collins $html .= '<div class="mikio-nav-item">'; 828ab45ba71SJames Collins $html .= $this->includeSearch(false); 829ab45ba71SJames Collins $html .= '</div>'; 830a8eebd82SJames Collins break; 831a8eebd82SJames Collins case 'dokuwiki': 8329cff245bSJames Collins $html .= $this->includeDWMenu(false); 833a8eebd82SJames Collins break; 834a8eebd82SJames Collins } 835a8eebd82SJames Collins } 836ab45ba71SJames Collins 837ab45ba71SJames Collins $html .= '</div>'; 838f8039bf2SJames Collins $html .= '</div>'; 839ab45ba71SJames Collins $html .= '</nav>'; 840ab45ba71SJames Collins 841a8eebd82SJames Collins // Sub Navbar 8429cff245bSJames Collins if ($showSub === true) { 8439cff245bSJames Collins $sub = $this->includePage('submenu', false); 844*3a385f2cSJames Collins if (empty($sub) === false) { 8459cff245bSJames Collins $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>'; 8469cff245bSJames Collins } 847ab45ba71SJames Collins } 848ab45ba71SJames Collins 8499cff245bSJames Collins if ($print === true) { 8509cff245bSJames Collins echo $html; 8519cff245bSJames Collins } 852ab45ba71SJames Collins return $html; 853ab45ba71SJames Collins } 854ab45ba71SJames Collins 855ab45ba71SJames Collins 856a8eebd82SJames Collins /** 857a8eebd82SJames Collins * Is there a sidebar 858a8eebd82SJames Collins * 8599cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 860a8eebd82SJames Collins * @return boolean if sidebar exists 861a8eebd82SJames Collins */ 8629cff245bSJames Collins public function sidebarExists(string $prefix = '') 86310b40067Snomadjimbob { 864a8eebd82SJames Collins global $conf; 865a8eebd82SJames Collins 866*3a385f2cSJames Collins if (strcasecmp($prefix, 'left') === 0) { 8679cff245bSJames Collins $prefix = ''; 8689cff245bSJames Collins } 869a8eebd82SJames Collins 870a8eebd82SJames Collins return $this->pageExists($conf['sidebar' . $prefix]); 871a8eebd82SJames Collins } 872a8eebd82SJames Collins 873a8eebd82SJames Collins 874a8eebd82SJames Collins /** 875ab45ba71SJames Collins * Print or return the sidebar content 876ab45ba71SJames Collins * 8779cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 8789cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 8799cff245bSJames Collins * @param boolean $parse Parse the content. 880ab45ba71SJames Collins * @return string generated content 881ab45ba71SJames Collins */ 8829cff245bSJames Collins public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true) 88310b40067Snomadjimbob { 884ab45ba71SJames Collins global $conf, $ID; 885ab45ba71SJames Collins 886ab45ba71SJames Collins $html = ''; 887ab45ba71SJames Collins $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix)); 888ab45ba71SJames Collins $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix)); 889ab45ba71SJames Collins 890*3a385f2cSJames Collins if (empty($confPrefix) === true) { 8919cff245bSJames Collins $confPrefix = 'Left'; 8929cff245bSJames Collins } 893*3a385f2cSJames Collins if (strcasecmp($prefix, 'Left') === 0) { 8949cff245bSJames Collins $prefix = ''; 8959cff245bSJames Collins } 896ab45ba71SJames Collins 897*3a385f2cSJames Collins empty($sidebarPage = $conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar']; 898ab45ba71SJames Collins 8999cff245bSJames Collins if ( 9009cff245bSJames Collins $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false && 9019cff245bSJames Collins p_get_metadata($ID, 'nosidebar', false) === false 9029cff245bSJames Collins ) { 9039cff245bSJames Collins $content = $this->includePage($sidebarPage . 'header', false); 904*3a385f2cSJames Collins if (empty($content) === false) { 9059cff245bSJames Collins $html .= '<div class="mikio-sidebar-header">' . $content . '</div>'; 9069cff245bSJames Collins } 907ab45ba71SJames Collins 908*3a385f2cSJames Collins if (empty($prefix) === true) { 9099cff245bSJames Collins $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'), 9109cff245bSJames Collins $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4') 9119cff245bSJames Collins ]; 912ab45ba71SJames Collins 913a8eebd82SJames Collins foreach ($rows as $row) { 914a8eebd82SJames Collins switch ($row) { 915a8eebd82SJames Collins case 'search': 9169cff245bSJames Collins $html .= $this->includeSearch(false); 917a8eebd82SJames Collins break; 918a8eebd82SJames Collins case 'logged in user': 9199cff245bSJames Collins $html .= $this->includeLoggedIn(false); 920a8eebd82SJames Collins break; 921a8eebd82SJames Collins case 'content': 9229cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 923*3a385f2cSJames Collins if (empty($content) === false) { 9249cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 9259cff245bSJames Collins } 926a8eebd82SJames Collins break; 927a8eebd82SJames Collins case 'tags': 928a8eebd82SJames Collins $html .= '<div class="mikio-tags"></div>'; 929a8eebd82SJames Collins } 930a8eebd82SJames Collins } 931a8eebd82SJames Collins } else { 9329cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 933*3a385f2cSJames Collins if (empty($content) === false) { 9349cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 9359cff245bSJames Collins } 9369cff245bSJames Collins }//end if 9379cff245bSJames Collins 9389cff245bSJames Collins $content = $this->includePage($sidebarPage . 'footer', false); 939*3a385f2cSJames Collins if (empty($content) === false) { 9409cff245bSJames Collins $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>'; 9419cff245bSJames Collins } 9429cff245bSJames Collins }//end if 9439cff245bSJames Collins 944*3a385f2cSJames Collins if (empty($html) === true) { 945*3a385f2cSJames Collins if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) { 9469cff245bSJames Collins $html = ' '; 9479cff245bSJames Collins } 9489cff245bSJames Collins if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) { 9499cff245bSJames Collins $html = ' '; 9509cff245bSJames Collins } 951a8eebd82SJames Collins } 952ab45ba71SJames Collins 953*3a385f2cSJames Collins if (empty($html) === false) { 954*3a385f2cSJames Collins empty($html = '<aside class="mikio-sidebar mikio-sidebar-' . ($prefix) === true ? 'left' : $prefix) . 9559cff245bSJames Collins '"><a class="mikio-sidebar-toggle' . 9569cff245bSJames Collins ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' . 9579cff245bSJames Collins tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' . 9589cff245bSJames Collins $html . '</div></aside>'; 959ab45ba71SJames Collins } 960ab45ba71SJames Collins 9619cff245bSJames Collins if ($parse === true) { 9629cff245bSJames Collins $html = $this->includeIcons($html); 9633a04a100SJames Collins } 9649cff245bSJames Collins if ($print === true) { 9659cff245bSJames Collins echo $html; 966ab45ba71SJames Collins } 967ab45ba71SJames Collins return $html; 968ab45ba71SJames Collins } 969ab45ba71SJames Collins 970ab45ba71SJames Collins 971a8eebd82SJames Collins /** 972ab45ba71SJames Collins * Print or return the page tools content 973ab45ba71SJames Collins * 9749cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 9759cff245bSJames Collins * @param boolean $includeId Include the dw__pagetools id in the element. 976ab45ba71SJames Collins * @return string generated content 977ab45ba71SJames Collins */ 9789cff245bSJames Collins public function includePageTools(bool $print = true, bool $includeId = false) 97910b40067Snomadjimbob { 9801293ce10SJames Collins global $USERINFO; 9811293ce10SJames Collins 9829cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 983ab45ba71SJames Collins $html = ''; 984ab45ba71SJames Collins 9859cff245bSJames Collins $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">'; 986b9c0582bSJames Collins $html .= '<ul class="tools">'; 987ab45ba71SJames Collins 988ab45ba71SJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 989ab45ba71SJames Collins foreach ($items as $item) { 9909cff245bSJames Collins $classes = []; 9913fd763a0SJames Collins $classes[] = $item->getType(); 9923fd763a0SJames Collins $attr = $item->getLinkAttributes(); 9933fd763a0SJames Collins 9949cff245bSJames Collins if (empty($attr['class']) === false) { 9953fd763a0SJames Collins $classes = array_merge($classes, explode(' ', $attr['class'])); 996ab45ba71SJames Collins } 997ab45ba71SJames Collins 9983fd763a0SJames Collins $classes = array_unique($classes); 9993fd763a0SJames Collins 10001293ce10SJames Collins $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType())); 10019cff245bSJames Collins if ( 1002*3a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 1003*3a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 1004*3a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true)) 10059cff245bSJames Collins ) { 10063fd763a0SJames Collins $html .= '<li class="' . implode(' ', $classes) . '">'; 10079cff245bSJames Collins $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' . 10089cff245bSJames Collins $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) . 10099cff245bSJames Collins '</div><span class="a11y">' . $item->getLabel() . '</span></a>'; 10103fd763a0SJames Collins $html .= '</li>'; 10113fd763a0SJames Collins } 10129cff245bSJames Collins }//end foreach 10133fd763a0SJames Collins 10143fd763a0SJames Collins $html .= '</ul>'; 1015ab45ba71SJames Collins $html .= '</nav>'; 1016ab45ba71SJames Collins 10179cff245bSJames Collins if ($print === true) { 10189cff245bSJames Collins echo $html; 10199cff245bSJames Collins } 1020ab45ba71SJames Collins return $html; 1021ab45ba71SJames Collins } 1022ab45ba71SJames Collins 1023ab45ba71SJames Collins 1024a8eebd82SJames Collins /** 1025a8eebd82SJames Collins * Print or return the search bar 1026a8eebd82SJames Collins * 10279cff245bSJames Collins * @param boolean $print Print content. 1028a8eebd82SJames Collins * @return string contents of the search bar 1029a8eebd82SJames Collins */ 10309cff245bSJames Collins public function includeSearch(bool $print = true) 103110b40067Snomadjimbob { 10329cff245bSJames Collins global $lang, $ID, $ACT, $QUERY; 1033ab45ba71SJames Collins $html = ''; 1034ab45ba71SJames Collins 10359cff245bSJames Collins $html .= '<form class="mikio-search search" action="' . wl() . 10369cff245bSJames Collins '" accept-charset="utf-8" method="get" role="search">'; 1037a8eebd82SJames Collins $html .= '<input type="hidden" name="do" value="search">'; 1038a8eebd82SJames Collins $html .= '<input type="hidden" name="id" value="' . $ID . '">'; 1039c1cb9f15SChris MacMackin $html .= '<input name="q" '; 10409cff245bSJames Collins if ($this->getConf('searchUseTypeahead') === true) { 1041c1cb9f15SChris MacMackin $html .= 'class="search_typeahead" '; 1042c1cb9f15SChris MacMackin } 10439cff245bSJames Collins $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' . 1044*3a385f2cSJames Collins ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />'; 1045a8eebd82SJames Collins $html .= '<button type="submit" title="' . $lang['btn_search'] . '">'; 1046*3a385f2cSJames Collins if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) { 1047a8eebd82SJames Collins $html .= $this->mikioInlineIcon('search'); 1048ab45ba71SJames Collins } else { 1049ab45ba71SJames Collins $html .= $lang['btn_search']; 1050ab45ba71SJames Collins } 1051ab45ba71SJames Collins $html .= '</button>'; 1052ab45ba71SJames Collins $html .= '</form>'; 1053ab45ba71SJames Collins 10549cff245bSJames Collins if ($print === true) { 10559cff245bSJames Collins echo $html; 10569cff245bSJames Collins } 1057ab45ba71SJames Collins return $html; 1058ab45ba71SJames Collins } 1059ab45ba71SJames Collins 1060ab45ba71SJames Collins 1061a8eebd82SJames Collins /** 1062a8eebd82SJames Collins * Print or return content 1063a8eebd82SJames Collins * 10649cff245bSJames Collins * @param boolean $print Print content. 1065a8eebd82SJames Collins * @return string contents 1066a8eebd82SJames Collins */ 10679cff245bSJames Collins public function includeContent(bool $print = true) 106810b40067Snomadjimbob { 1069ab45ba71SJames Collins ob_start(); 10709cff245bSJames Collins tpl_content(false); 1071ab45ba71SJames Collins $html = ob_get_contents(); 1072ab45ba71SJames Collins ob_end_clean(); 1073ab45ba71SJames Collins 1074ab45ba71SJames Collins $html = $this->includeIcons($html); 1075ab45ba71SJames Collins $html = $this->parseContent($html); 1076ab45ba71SJames Collins 1077ab45ba71SJames Collins $html .= '<div style="clear:both"></div>'; 1078ab45ba71SJames Collins 10799cff245bSJames Collins if ($this->getConf('heroTitle') === false) { 10809cff245bSJames Collins $html = '<div class="mikio-tags"></div>' . $html; 10819cff245bSJames Collins } 1082a8eebd82SJames Collins 1083a8eebd82SJames Collins $html = '<div class="mikio-article-content">' . $html . '</div>'; 1084a8eebd82SJames Collins 10859cff245bSJames Collins if ($print === true) { 10869cff245bSJames Collins echo $html; 10879cff245bSJames Collins } 1088ab45ba71SJames Collins return $html; 1089ab45ba71SJames Collins } 1090ab45ba71SJames Collins 1091a8eebd82SJames Collins /** 1092ab45ba71SJames Collins * Print or return footer 1093ab45ba71SJames Collins * 10949cff245bSJames Collins * @param boolean $print Print footer. 10959cff245bSJames Collins * @return string HTML string containing footer 1096ab45ba71SJames Collins */ 10979cff245bSJames Collins public function includeFooter(bool $print = true) 109810b40067Snomadjimbob { 1099ab45ba71SJames Collins global $ACT; 1100ab45ba71SJames Collins 1101ab45ba71SJames Collins $html = ''; 1102ab45ba71SJames Collins 1103ab45ba71SJames Collins $html .= '<footer class="mikio-footer">'; 11049cff245bSJames Collins $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>'; 11059cff245bSJames Collins $html .= $this->includePage('footer', false); 1106ab45ba71SJames Collins 1107a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('footerCustomMenuText')); 1108ab45ba71SJames Collins 11099cff245bSJames Collins if ($this->getConf('footerSearch') === true) { 1110ab45ba71SJames Collins $html .= '<div class="mikio-footer-search">'; 11119cff245bSJames Collins $html .= $this->includeSearch(false); 1112ab45ba71SJames Collins $html .= '</div>'; 1113ab45ba71SJames Collins } 1114ab45ba71SJames Collins 1115a8eebd82SJames Collins $showPageTools = $this->getConf('pageToolsFooter'); 11169cff245bSJames Collins if ( 1117*3a385f2cSJames Collins strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 || 1118*3a385f2cSJames Collins $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0) 11199cff245bSJames Collins ) { 11209cff245bSJames Collins $html .= $this->includePageTools(false); 11219cff245bSJames Collins } 1122ab45ba71SJames Collins 11239cff245bSJames Collins $meta['licenseType'] = ['multichoice', '_choices' => ['none', 'badge', 'button']]; 11249cff245bSJames Collins $meta['licenseImageOnly'] = ['onoff']; 1125ab45ba71SJames Collins 1126ab45ba71SJames Collins $licenseType = $this->getConf('licenseType'); 11279cff245bSJames Collins if ($licenseType !== 'none') { 11289cff245bSJames Collins $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true); 1129ab45ba71SJames Collins } 1130ab45ba71SJames Collins 1131ab45ba71SJames Collins $html .= '</footer>'; 1132ab45ba71SJames Collins 11339cff245bSJames Collins if ($print === true) { 11349cff245bSJames Collins echo $html; 11359cff245bSJames Collins } 1136ab45ba71SJames Collins return $html; 1137ab45ba71SJames Collins } 1138ab45ba71SJames Collins 1139ab45ba71SJames Collins 1140a8eebd82SJames Collins /** 1141ab45ba71SJames Collins * Print or return breadcrumb trail 1142ab45ba71SJames Collins * 11439cff245bSJames Collins * @param boolean $print Print out trail. 11449cff245bSJames Collins * @param boolean $parse Parse trail before printing. 11459cff245bSJames Collins * @return string HTML string containing breadcrumbs 1146ab45ba71SJames Collins */ 11479cff245bSJames Collins public function includeBreadcrumbs(bool $print = true, bool $parse = true) 114810b40067Snomadjimbob { 1149a8eebd82SJames Collins global $conf, $ID, $lang, $ACT; 1150a8eebd82SJames Collins 1151*3a385f2cSJames Collins if ( 1152*3a385f2cSJames Collins $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 && 1153*3a385f2cSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 1154*3a385f2cSJames Collins ) { 11559cff245bSJames Collins return ''; 11569cff245bSJames Collins } 1157ab45ba71SJames Collins 1158ab45ba71SJames Collins $html = '<div class="mikio-breadcrumbs">'; 1159f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 1160*3a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 11619cff245bSJames Collins if ($conf['breadcrumbs'] === true) { 11629cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) { 1163ab45ba71SJames Collins ob_start(); 116475adba86SJames Collins tpl_breadcrumbs(); 1165ab45ba71SJames Collins $html .= ob_get_contents(); 1166ab45ba71SJames Collins ob_end_clean(); 1167ab45ba71SJames Collins } else { 1168ab45ba71SJames Collins $sep = '•'; 1169ab45ba71SJames Collins $prefix = $lang['breadcrumb']; 1170ab45ba71SJames Collins 11719cff245bSJames Collins if ($this->getConf('breadcrumbSep') === true) { 1172ab45ba71SJames Collins $sep = $this->getConf('breadcrumbSepText'); 11739cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-sep', false); 1174ab45ba71SJames Collins 11759cff245bSJames Collins if ($img !== false) { 1176ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1177ab45ba71SJames Collins } 117847161538SJames Collins } 117947161538SJames Collins 11809cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === true) { 1181ab45ba71SJames Collins $prefix = $this->getConf('breadcrumbPrefixText'); 11829cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-prefix', false); 1183ab45ba71SJames Collins 11849cff245bSJames Collins if ($img !== false) { 1185ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 1186ab45ba71SJames Collins } 1187ab45ba71SJames Collins } 1188ab45ba71SJames Collins 1189ab45ba71SJames Collins $crumbs = breadcrumbs(); 1190ab45ba71SJames Collins 1191ab45ba71SJames Collins $html .= '<ul>'; 1192*3a385f2cSJames Collins if (empty($prefix) === false) { 11939cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 11949cff245bSJames Collins } 1195ab45ba71SJames Collins 1196ab45ba71SJames Collins $last = count($crumbs); 1197ab45ba71SJames Collins $i = 0; 1198ab45ba71SJames Collins foreach ($crumbs as $id => $name) { 1199ab45ba71SJames Collins $i++; 1200ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 12019cff245bSJames Collins $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>'; 12029cff245bSJames Collins $html .= tpl_pagelink($id, null, true); 1203ab45ba71SJames Collins $html .= '</li>'; 1204ab45ba71SJames Collins } 1205ab45ba71SJames Collins 1206ab45ba71SJames Collins $html .= '</ul>'; 12079cff245bSJames Collins }//end if 12089cff245bSJames Collins }//end if 12099cff245bSJames Collins }//end if 12103d11a778SJames Collins 12113d11a778SJames Collins $html .= '</div>'; 12123d11a778SJames Collins $html .= '</div>'; 12133d11a778SJames Collins 12149cff245bSJames Collins if ($parse === true) { 12159cff245bSJames Collins $html = $this->includeIcons($html); 12169cff245bSJames Collins } 12179cff245bSJames Collins if ($print === true) { 12189cff245bSJames Collins echo $html; 12199cff245bSJames Collins } 12203d11a778SJames Collins return $html; 12213d11a778SJames Collins } 12223d11a778SJames Collins 12233d11a778SJames Collins /** 12243d11a778SJames Collins * Print or return you are here trail 12253d11a778SJames Collins * 12269cff245bSJames Collins * @param boolean $print Print out trail. 12279cff245bSJames Collins * @param boolean $parse Parse trail before printing. 12289cff245bSJames Collins * @return string HTML string containing breadcrumbs 12293d11a778SJames Collins */ 12309cff245bSJames Collins public function includeYouAreHere(bool $print = true, bool $parse = true) 12313d11a778SJames Collins { 12323d11a778SJames Collins global $conf, $ID, $lang, $ACT; 12333d11a778SJames Collins 1234*3a385f2cSJames Collins if ( 1235*3a385f2cSJames Collins $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 && 1236*3a385f2cSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 1237*3a385f2cSJames Collins ) { 12389cff245bSJames Collins return ''; 12399cff245bSJames Collins } 12403d11a778SJames Collins 12413d11a778SJames Collins $html = '<div class="mikio-youarehere">'; 12423d11a778SJames Collins $html .= '<div class="mikio-container">'; 1243*3a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 12449cff245bSJames Collins if ($conf['youarehere'] === true) { 12459cff245bSJames Collins if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) { 1246ab45ba71SJames Collins ob_start(); 124775adba86SJames Collins tpl_youarehere(); 1248ab45ba71SJames Collins $html .= ob_get_contents(); 1249ab45ba71SJames Collins ob_end_clean(); 1250ab45ba71SJames Collins } else { 1251ab45ba71SJames Collins $sep = ' » '; 1252ab45ba71SJames Collins $prefix = $lang['youarehere']; 1253ab45ba71SJames Collins 12549cff245bSJames Collins if ($this->getConf('youarehereSep') === true) { 12553d11a778SJames Collins $sep = $this->getConf('youarehereSepText'); 12569cff245bSJames Collins $img = $this->getMediaFile('youarehere-sep', false); 1257ab45ba71SJames Collins 12589cff245bSJames Collins if ($img !== false) { 1259ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1260ab45ba71SJames Collins } 126175adba86SJames Collins } 126275adba86SJames Collins 12639cff245bSJames Collins if ($this->getConf('youareherePrefix') === true) { 12643d11a778SJames Collins $prefix = $this->getConf('youareherePrefixText'); 12659cff245bSJames Collins $img = $this->getMediaFile('youarehere-prefix', false); 1266ab45ba71SJames Collins 12679cff245bSJames Collins if ($img !== false) { 1268ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 126975adba86SJames Collins } 127047161538SJames Collins } 127147161538SJames Collins 1272ab45ba71SJames Collins $html .= '<ul>'; 1273*3a385f2cSJames Collins if (empty($prefix) === false) { 12749cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 12759cff245bSJames Collins } 12769cff245bSJames Collins $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>'; 1277ab45ba71SJames Collins 1278ab45ba71SJames Collins $parts = explode(':', $ID); 1279ab45ba71SJames Collins $count = count($parts); 1280ab45ba71SJames Collins 1281ab45ba71SJames Collins $part = ''; 12829cff245bSJames Collins for ($i = 0; $i < ($count - 1); $i++) { 1283ab45ba71SJames Collins $part .= $parts[$i] . ':'; 1284ab45ba71SJames Collins $page = $part; 12859cff245bSJames Collins if ($page === $conf['start']) { 12869cff245bSJames Collins continue; 12879cff245bSJames Collins } 1288ab45ba71SJames Collins 1289ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 12909cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1291ab45ba71SJames Collins } 1292ab45ba71SJames Collins 1293ab45ba71SJames Collins resolve_pageid('', $page, $exists); 12949cff245bSJames Collins if ((isset($page) === true && $page === $part . $parts[$i]) === false) { 1295ab45ba71SJames Collins $page = $part . $parts[$i]; 12969cff245bSJames Collins if ($page !== $conf['start']) { 1297ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 12989cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1299ab45ba71SJames Collins } 1300ab45ba71SJames Collins } 1301ab45ba71SJames Collins 1302ab45ba71SJames Collins $html .= '</ul>'; 13039cff245bSJames Collins }//end if 13049cff245bSJames Collins }//end if 1305ab45ba71SJames Collins 13063d11a778SJames Collins $showLast = $this->getConf('youarehereShowLast'); 13079cff245bSJames Collins if ($showLast !== 0) { 1308a8eebd82SJames Collins preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches); 13099cff245bSJames Collins if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) { 1310a8eebd82SJames Collins $count = count($matches[0]); 1311a8eebd82SJames Collins $list = ''; 1312a8eebd82SJames Collins 1313a8eebd82SJames Collins // Show Home 1314a8eebd82SJames Collins $list .= $matches[0][0] . $matches[0][1]; 1315a8eebd82SJames Collins 1316a8eebd82SJames Collins $list .= '<li>...</li>'; 13179cff245bSJames Collins for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) { 1318a8eebd82SJames Collins $list .= $matches[0][$i]; 1319a8eebd82SJames Collins } 1320a8eebd82SJames Collins 1321a8eebd82SJames Collins $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html); 1322a8eebd82SJames Collins } 1323a8eebd82SJames Collins } 1324a8eebd82SJames Collins 13253d11a778SJames Collins switch ($this->getConf('youarehereHome')) { 1326a8eebd82SJames Collins case 'none': 1327a8eebd82SJames Collins $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2); 1328a8eebd82SJames Collins break; 1329a8eebd82SJames Collins case 'home': 1330a8eebd82SJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1); 1331a8eebd82SJames Collins break; 1332a8eebd82SJames Collins case 'icon': 13339cff245bSJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . 13349cff245bSJames Collins $this->mikioInlineIcon('home') . '$3', $html, 1); 1335a8eebd82SJames Collins break; 1336a8eebd82SJames Collins } 1337a8eebd82SJames Collins } else { 1338a8eebd82SJames Collins $html .= '≪ '; 13399cff245bSJames Collins if (isset($_GET['page']) === true) { 13409cff245bSJames Collins $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a> / '; 1341a8eebd82SJames Collins } 13424057121fSJames Collins $html .= '<a href="' . wl($ID) . '">View Page</a>'; 13439cff245bSJames Collins }//end if 13449cff245bSJames Collins 13459cff245bSJames Collins $html .= '</div>'; 13469cff245bSJames Collins $html .= '</div>'; 13479cff245bSJames Collins 13489cff245bSJames Collins if ($parse === true) { 13499cff245bSJames Collins $html = $this->includeIcons($html); 1350a8eebd82SJames Collins } 13519cff245bSJames Collins if ($print === true) { 13529cff245bSJames Collins echo $html; 13539cff245bSJames Collins } 1354ab45ba71SJames Collins return $html; 1355ab45ba71SJames Collins } 1356ab45ba71SJames Collins 13571785fc73SJames Collins /** 13581785fc73SJames Collins * Get Page Title 13599cff245bSJames Collins * 13609cff245bSJames Collins * @return string page title 13611785fc73SJames Collins */ 136210b40067Snomadjimbob public function parsePageTitle() 136310b40067Snomadjimbob { 13642060e56cSJames Collins global $ID; 13652060e56cSJames Collins 13662060e56cSJames Collins $title = p_get_first_heading($ID); 13679cff245bSJames Collins if (strlen($title) <= 0) { 13689cff245bSJames Collins $title = tpl_pagetitle(null, true); 13699cff245bSJames Collins } 13701785fc73SJames Collins $title = $this->includeIcons($title); 13711785fc73SJames Collins 13721785fc73SJames Collins return $title; 13731785fc73SJames Collins } 13741785fc73SJames Collins 1375ab45ba71SJames Collins 137675adba86SJames Collins /** 1377a8eebd82SJames Collins * Print or return hero block 137875adba86SJames Collins * 13799cff245bSJames Collins * @param boolean $print Print content. 1380a8eebd82SJames Collins * @return string contents of hero 138175adba86SJames Collins */ 13829cff245bSJames Collins public function includeHero(bool $print = true) 138310b40067Snomadjimbob { 1384a8eebd82SJames Collins $html = ''; 138547161538SJames Collins 13869cff245bSJames Collins if ($this->getConf('heroTitle') === true) { 1387a8eebd82SJames Collins $html .= '<div class="mikio-hero">'; 1388f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 1389a8eebd82SJames Collins $html .= '<div class="mikio-hero-text">'; 1390*3a385f2cSJames Collins if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) { 13919cff245bSJames Collins $html .= $this->includeYouAreHere(false); 13929cff245bSJames Collins } 1393*3a385f2cSJames Collins if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) { 13949cff245bSJames Collins $html .= $this->includeBreadcrumbs(false); 13959cff245bSJames Collins } 1396ab45ba71SJames Collins 1397a8eebd82SJames Collins $html .= '<h1 class="mikio-hero-title">'; 13981785fc73SJames Collins $html .= $this->parsePageTitle(); // No idea why this requires a blank space afterwards to work? 1399a8eebd82SJames Collins $html .= '</h1>'; 1400a8eebd82SJames Collins $html .= '<h2 class="mikio-hero-subtitle"></h2>'; 1401a8eebd82SJames Collins $html .= '</div>'; 140247161538SJames Collins 14039cff245bSJames Collins $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true)); 1404a8eebd82SJames Collins $hero_image_resize_class = ''; 1405*3a385f2cSJames Collins if (empty($hero_image) === false) { 1406a8eebd82SJames Collins $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"'; 1407a8eebd82SJames Collins $hero_image_resize_class = ' mikio-hero-image-resize'; 140847161538SJames Collins } 1409a8eebd82SJames Collins 14109cff245bSJames Collins $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image . 14119cff245bSJames Collins '><div class="mikio-tags"></div></div>'; 1412a8eebd82SJames Collins 1413a8eebd82SJames Collins $html .= '</div>'; 1414f8039bf2SJames Collins $html .= '</div>'; 14159cff245bSJames Collins }//end if 14169cff245bSJames Collins 14179cff245bSJames Collins if ($print === true) { 14189cff245bSJames Collins echo $html; 141975adba86SJames Collins } 1420a8eebd82SJames Collins 1421a8eebd82SJames Collins return $html; 142275adba86SJames Collins } 142375adba86SJames Collins 142475adba86SJames Collins 142575adba86SJames Collins /** 1426a8eebd82SJames Collins * Print or return out TOC 142775adba86SJames Collins * 14289cff245bSJames Collins * @param boolean $print Print TOC. 14299cff245bSJames Collins * @param boolean $parse Parse icons. 1430a8eebd82SJames Collins * @return string contents of TOC 143175adba86SJames Collins */ 14329cff245bSJames Collins public function includeTOC(bool $print = true, bool $parse = true) 143310b40067Snomadjimbob { 1434ab45ba71SJames Collins $html = ''; 14352b4583abSJames Collins 1436ab45ba71SJames Collins $tocHtml = tpl_toc(true); 1437ab45ba71SJames Collins 1438*3a385f2cSJames Collins if (empty($tocHtml) === false) { 1439ab45ba71SJames Collins $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml); 1440a8eebd82SJames Collins $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml); 1441ab45ba71SJames Collins 1442ab45ba71SJames Collins $html .= '<div class="mikio-toc">'; 1443ab45ba71SJames Collins $html .= $tocHtml; 1444ab45ba71SJames Collins $html .= '</div>'; 14452b4583abSJames Collins } 14462b4583abSJames Collins 14479cff245bSJames Collins if ($parse === true) { 14489cff245bSJames Collins $html = $this->includeIcons($html); 14499cff245bSJames Collins } 14509cff245bSJames Collins 14519cff245bSJames Collins if ($print === true) { 1452ab45ba71SJames Collins echo $html; 1453ab45ba71SJames Collins } 1454ab45ba71SJames Collins 14559cff245bSJames Collins return $html; 14569cff245bSJames Collins } 14579cff245bSJames Collins 1458ab45ba71SJames Collins 1459a8eebd82SJames Collins /** 1460ab45ba71SJames Collins * Parse the string and replace icon elements with included icon libraries 1461ab45ba71SJames Collins * 14629cff245bSJames Collins * @param string $str Content to parse. 1463ab45ba71SJames Collins * @return string parsed string 1464ab45ba71SJames Collins */ 14659cff245bSJames Collins public function includeIcons(string $str) 146610b40067Snomadjimbob { 1467ab45ba71SJames Collins global $ACT, $MIKIO_ICONS; 1468ab45ba71SJames Collins 1469ab45ba71SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 1470*3a385f2cSJames Collins if (empty($iconTag) === true) { 14719cff245bSJames Collins return $str; 14729cff245bSJames Collins } 1473ab45ba71SJames Collins 14749cff245bSJames Collins if ( 14759cff245bSJames Collins in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true || 1476*3a385f2cSJames Collins strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0 14779cff245bSJames Collins ) { 1478a2005a27SJames Collins $content = $str; 1479a2005a27SJames Collins $preview = null; 1480a2005a27SJames Collins 1481*3a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 14829cff245bSJames Collins $html = new \simple_html_dom(); 1483a2005a27SJames Collins $html->stripRNAttrValues = false; 1484a2005a27SJames Collins $html->load($str, true, false); 1485a2005a27SJames Collins 1486a2005a27SJames Collins $preview = $html->find('div.preview'); 14879cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1488a2005a27SJames Collins $content = $preview[0]->innertext; 1489a2005a27SJames Collins } 1490a2005a27SJames Collins } 1491a2005a27SJames Collins 14921785fc73SJames Collins $page_regex = '/(.*)/'; 14939cff245bSJames Collins if (stripos($str, '<pre') !== false) { 14941785fc73SJames Collins $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/'; 14951785fc73SJames Collins } 14961785fc73SJames Collins 14971785fc73SJames Collins $content = preg_replace_callback($page_regex, function ($icons) { 1498a2005a27SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 1499a2005a27SJames Collins 150010b40067Snomadjimbob return preg_replace_callback( 150110b40067Snomadjimbob '/<' . $iconTag . ' ([\w\- #]*)>(?=[^>]*(<|$))/', 1502ab45ba71SJames Collins function ($matches) { 1503ab45ba71SJames Collins global $MIKIO_ICONS; 1504ab45ba71SJames Collins 1505ab45ba71SJames Collins $s = $matches[0]; 1506ab45ba71SJames Collins 1507ab45ba71SJames Collins if (count($MIKIO_ICONS) > 0) { 1508ab45ba71SJames Collins $icon = $MIKIO_ICONS[0]; 1509ab45ba71SJames Collins 1510ab45ba71SJames Collins if (count($matches) > 1) { 1511ab45ba71SJames Collins $e = explode(' ', $matches[1]); 1512ab45ba71SJames Collins 1513ab45ba71SJames Collins if (count($e) > 1) { 1514ab45ba71SJames Collins foreach ($MIKIO_ICONS as $iconItem) { 15159cff245bSJames Collins if (strcasecmp($iconItem['name'], $e[0]) === 0) { 1516ab45ba71SJames Collins $icon = $iconItem; 1517ab45ba71SJames Collins 1518ab45ba71SJames Collins $s = $icon['insert']; 1519ab45ba71SJames Collins for ($i = 1; $i < 9; $i++) { 1520*3a385f2cSJames Collins if (count(empty($e) < $i || $e[$i]) === true) { 15219cff245bSJames Collins if (isset($icon['$' . $i]) === true) { 1522ab45ba71SJames Collins $s = str_replace('$' . $i, $icon['$' . $i], $s); 1523ab45ba71SJames Collins } 1524ab45ba71SJames Collins } else { 1525ab45ba71SJames Collins $s = str_replace('$' . $i, $e[$i], $s); 1526ab45ba71SJames Collins } 1527ab45ba71SJames Collins } 1528ab45ba71SJames Collins 1529ab45ba71SJames Collins $dir = ''; 15309cff245bSJames Collins if (isset($icon['dir']) === true) { 15319cff245bSJames Collins $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/'; 15329cff245bSJames Collins } 1533ab45ba71SJames Collins 1534ab45ba71SJames Collins $s = str_replace('$0', $dir, $s); 1535ab45ba71SJames Collins 1536ab45ba71SJames Collins break; 15379cff245bSJames Collins }//end if 15389cff245bSJames Collins }//end foreach 1539ab45ba71SJames Collins } else { 1540ab45ba71SJames Collins $s = str_replace('$1', $matches[1], $icon['insert']); 15419cff245bSJames Collins }//end if 15429cff245bSJames Collins }//end if 15439cff245bSJames Collins }//end if 154475adba86SJames Collins 1545ab45ba71SJames Collins $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count); 15469cff245bSJames Collins if ($count === 0) { 1547ab45ba71SJames Collins $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s); 1548ab45ba71SJames Collins } 1549ab45ba71SJames Collins 1550ab45ba71SJames Collins return $s; 1551ab45ba71SJames Collins }, 155210b40067Snomadjimbob $icons[0] 155310b40067Snomadjimbob ); 1554a2005a27SJames Collins }, $content); 1555a2005a27SJames Collins 1556*3a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 15579cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1558a2005a27SJames Collins $preview[0]->innertext = $content; 1559a2005a27SJames Collins } 1560a2005a27SJames Collins 1561a2005a27SJames Collins $str = $html->save(); 1562a2005a27SJames Collins $html->clear(); 1563a2005a27SJames Collins unset($html); 1564a2005a27SJames Collins } else { 1565a2005a27SJames Collins $str = $content; 1566a2005a27SJames Collins } 15679cff245bSJames Collins }//end if 1568ab45ba71SJames Collins 1569ab45ba71SJames Collins return $str; 1570ab45ba71SJames Collins } 157147161538SJames Collins 1572c165b184SJames Collins /** 1573a8eebd82SJames Collins * Parse HTML for theme 1574c165b184SJames Collins * 15759cff245bSJames Collins * @param string $content HTML content to parse. 1576a8eebd82SJames Collins * @return string Parsed content 1577c165b184SJames Collins */ 15789cff245bSJames Collins public function parseContent(string $content) 157910b40067Snomadjimbob { 1580ab45ba71SJames Collins global $INPUT, $ACT; 1581ab45ba71SJames Collins 1582a8eebd82SJames Collins // Add Mikio Section titles 1583*3a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 15849cff245bSJames Collins $admin_sections = [ 1585ab45ba71SJames Collins // Section Insert Before Icon 15869cff245bSJames Collins 'navbar' => ['navbarUseTitleIcon', ''], 15879cff245bSJames Collins 'search' => ['searchButton', ''], 15889cff245bSJames Collins 'hero' => ['heroTitle', ''], 15899cff245bSJames Collins 'tags' => ['tagsConsolidate', ''], 15909cff245bSJames Collins 'breadcrumb' => ['breadcrumbHideHome', ''], 15919cff245bSJames Collins 'youarehere' => ['youarehereHideHome', ''], 15929cff245bSJames Collins 'sidebar' => ['sidebarShowLeft', ''], 15939cff245bSJames Collins 'toc' => ['tocFull', ''], 15949cff245bSJames Collins 'pagetools' => ['pageToolsFloating', ''], 15959cff245bSJames Collins 'footer' => ['footerCustomMenuText', ''], 15969cff245bSJames Collins 'license' => ['licenseType', ''], 15979cff245bSJames Collins 'acl' => ['includePageUseACL', ''], 15989cff245bSJames Collins 'sticky' => ['stickyTopHeader', ''], 15999cff245bSJames Collins ]; 1600ab45ba71SJames Collins 1601ab45ba71SJames Collins foreach ($admin_sections as $section => $items) { 1602ab45ba71SJames Collins $search = $items[0]; 1603ab45ba71SJames Collins $icon = $items[1]; 1604ab45ba71SJames Collins 160510b40067Snomadjimbob $content = preg_replace( 1606adf52ebbSJames Collins '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/', 16079cff245bSJames Collins '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) . 16089cff245bSJames Collins tpl_getLang('config_' . $section) . 16099cff245bSJames Collins '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' . 16109cff245bSJames Collins $search . '</span>', 161110b40067Snomadjimbob $content 161210b40067Snomadjimbob ); 1613ab45ba71SJames Collins } 16149cff245bSJames Collins }//end if 1615ab45ba71SJames Collins 1616*3a385f2cSJames Collins if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) { 1617a8eebd82SJames Collins $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content); 1618a8eebd82SJames Collins } 1619ab45ba71SJames Collins 1620a8eebd82SJames Collins // Page Revisions - Table Fix 16219cff245bSJames Collins if (strpos($content, 'id="page__revisions"') !== false) { 16229cff245bSJames Collins $content = preg_replace( 16239cff245bSJames Collins '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/', 16249cff245bSJames Collins '<span>$1</span>', 16259cff245bSJames Collins $content 16269cff245bSJames Collins ); 1627a8eebd82SJames Collins } 1628ab45ba71SJames Collins 16299cff245bSJames Collins $html = new \simple_html_dom(); 1630bc1032d9SJames Collins $html->stripRNAttrValues = false; 1631c165b184SJames Collins $html->load($content, true, false); 1632c165b184SJames Collins 16339cff245bSJames Collins if ($html === false) { 16349cff245bSJames Collins return $content; 16359cff245bSJames Collins } 1636ab45ba71SJames Collins 1637ab45ba71SJames Collins /* Buttons */ 1638ab45ba71SJames Collins foreach ($html->find('#config__manager button') as $node) { 1639ab45ba71SJames Collins $c = explode(' ', $node->class); 16409cff245bSJames Collins if (in_array('mikio-button', $c) === false) { 16419cff245bSJames Collins $c[] = 'mikio-button'; 16429cff245bSJames Collins } 1643ab45ba71SJames Collins $node->class = implode(' ', $c); 1644c165b184SJames Collins } 1645c165b184SJames Collins 1646ab45ba71SJames Collins 1647ab45ba71SJames Collins /* Buttons - Primary */ 1648ab45ba71SJames Collins foreach ($html->find('#config__manager [type=submit]') as $node) { 1649ab45ba71SJames Collins $c = explode(' ', $node->class); 16509cff245bSJames Collins if (in_array('mikio-primary', $c) === false) { 16519cff245bSJames Collins $c[] = 'mikio-primary'; 16529cff245bSJames Collins } 1653ab45ba71SJames Collins $node->class = implode(' ', $c); 1654ab45ba71SJames Collins } 1655ab45ba71SJames Collins 1656a8eebd82SJames Collins /* Hide page title if hero is enabled */ 16579cff245bSJames Collins if ($this->getConf('heroTitle') === true && $ACT !== 'preview') { 16581785fc73SJames Collins $pageTitle = $this->parsePageTitle(); 165947161538SJames Collins 166047161538SJames Collins foreach ($html->find('h1,h2,h3,h4') as $elm) { 16619cff245bSJames Collins if ($elm->innertext === $pageTitle) { 1662a8eebd82SJames Collins // $elm->innertext = ''; 1663a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1664a8eebd82SJames Collins 166547161538SJames Collins break; 166647161538SJames Collins } 166747161538SJames Collins } 166847161538SJames Collins } 1669c165b184SJames Collins 1670a8eebd82SJames Collins /* Hero subtitle */ 16712b4583abSJames Collins foreach ($html->find('p') as $elm) { 16722b4583abSJames Collins $i = stripos($elm->innertext, '~~hero-subtitle'); 16732b4583abSJames Collins if ($i !== false) { 16749cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 16752b4583abSJames Collins if ($j !== false) { 16769cff245bSJames Collins if ($j > ($i + 16)) { 16779cff245bSJames Collins $subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16)); 1678a8eebd82SJames Collins $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')'; 1679a8eebd82SJames Collins 1680a8eebd82SJames Collins // $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2); 1681a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext); 16822b4583abSJames Collins } 16832b4583abSJames Collins 16842b4583abSJames Collins break; 16852b4583abSJames Collins } 16862b4583abSJames Collins } 16872b4583abSJames Collins } 16882b4583abSJames Collins 1689a8eebd82SJames Collins /* Hero image */ 1690a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1691a8eebd82SJames Collins $image = ''; 1692a8eebd82SJames Collins preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches); 1693a8eebd82SJames Collins if (count($matches) > 0) { 1694a8eebd82SJames Collins preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches); 1695a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1696a8eebd82SJames Collins $image = $imageTagMatches[1]; 1697a8eebd82SJames Collins } else { 1698a8eebd82SJames Collins preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches); 1699a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1700a8eebd82SJames Collins $image = $imageTagMatches[1]; 1701a8eebd82SJames Collins } else { 1702a8eebd82SJames Collins $image = strip_tags($matches[1]); 17039cff245bSJames Collins if (stripos($image, ':') === false) { 17049cff245bSJames Collins $image = str_replace(['{', '}'], '', $image); 1705a8eebd82SJames Collins $i = stripos($image, '?'); 17069cff245bSJames Collins if ($i !== false) { 1707a8eebd82SJames Collins $image = substr($image, 0, $i); 1708c165b184SJames Collins } 1709c165b184SJames Collins 1710a8eebd82SJames Collins $image = ml($image, '', true, '', false); 1711ab45ba71SJames Collins } 1712ab45ba71SJames Collins } 1713ab45ba71SJames Collins } 1714ab45ba71SJames Collins 1715a8eebd82SJames Collins $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')'; 1716a8eebd82SJames Collins 1717a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext); 17189cff245bSJames Collins }//end if 17199cff245bSJames Collins }//end foreach 1720ab45ba71SJames Collins 17219cff245bSJames Collins /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color] 17229cff245bSJames Collins [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */ 1723a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1724a8eebd82SJames Collins $i = stripos($elm->innertext, '~~hero-colors'); 1725a8eebd82SJames Collins if ($i !== false) { 17269cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 1727a8eebd82SJames Collins if ($j !== false) { 17289cff245bSJames Collins if ($j > ($i + 14)) { 17299cff245bSJames Collins $color = substr($elm->innertext, ($i + 14), ($j - $i - 14)); 1730a8eebd82SJames Collins $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')'; 1731ab45ba71SJames Collins 1732a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext); 1733ab45ba71SJames Collins } 1734ab45ba71SJames Collins 1735a8eebd82SJames Collins break; 1736ab45ba71SJames Collins } 1737ab45ba71SJames Collins } 1738ab45ba71SJames Collins } 1739ab45ba71SJames Collins 174096ec8e1eSJames Collins /* Hide parts - ~~hide-parts [parts]~~ */ 174196ec8e1eSJames Collins foreach ($html->find('p') as $elm) { 174296ec8e1eSJames Collins $i = stripos($elm->innertext, '~~hide-parts'); 174396ec8e1eSJames Collins if ($i !== false) { 17449cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 174596ec8e1eSJames Collins if ($j !== false) { 17469cff245bSJames Collins if ($j > ($i + 13)) { 17479cff245bSJames Collins $parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13))); 174896ec8e1eSJames Collins $script = ''; 174996ec8e1eSJames Collins 175096ec8e1eSJames Collins foreach ($parts as $part) { 175196ec8e1eSJames Collins // $part = trim($part); 175296ec8e1eSJames Collins if (strlen($part) > 0) { 175396ec8e1eSJames Collins $script .= 'mikio.hidePart(\'' . $part . '\');'; 175496ec8e1eSJames Collins } 175596ec8e1eSJames Collins } 175696ec8e1eSJames Collins 175796ec8e1eSJames Collins if (strlen($script) > 0) { 175896ec8e1eSJames Collins $this->footerScript['hide-parts'] = $script; 175996ec8e1eSJames Collins } 176096ec8e1eSJames Collins 176196ec8e1eSJames Collins $elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext); 176296ec8e1eSJames Collins } 176396ec8e1eSJames Collins 176496ec8e1eSJames Collins break; 17659cff245bSJames Collins }//end if 17669cff245bSJames Collins }//end if 17679cff245bSJames Collins }//end foreach 176896ec8e1eSJames Collins 176996ec8e1eSJames Collins 1770a8eebd82SJames Collins /* Page Tags (tag plugin) */ 17719cff245bSJames Collins if ($this->getConf('tagsConsolidate') === true) { 1772a8eebd82SJames Collins $tags = ''; 1773a8eebd82SJames Collins foreach ($html->find('div.tags a') as $elm) { 1774a8eebd82SJames Collins $tags .= $elm->outertext; 1775a8eebd82SJames Collins } 1776a8eebd82SJames Collins 1777a8eebd82SJames Collins foreach ($html->find('div.tags') as $elm) { 1778a8eebd82SJames Collins $elm->innertext = ''; 1779a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1780a8eebd82SJames Collins } 1781a8eebd82SJames Collins 1782*3a385f2cSJames Collins if (empty($tags) === false) { 1783a8eebd82SJames Collins $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')'; 1784a8eebd82SJames Collins } 1785ab45ba71SJames Collins } 1786ab45ba71SJames Collins 1787ab45ba71SJames Collins // Configuration Manager 1788*3a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 1789ab45ba71SJames Collins // Additional save buttons 1790ab45ba71SJames Collins foreach ($html->find('#config__manager') as $cm) { 1791ab45ba71SJames Collins $saveButtons = ''; 1792ab45ba71SJames Collins 1793ab45ba71SJames Collins foreach ($cm->find('p') as $elm) { 1794ab45ba71SJames Collins $saveButtons = $elm->outertext; 1795a8eebd82SJames Collins $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons); 1796ab45ba71SJames Collins $elm->outertext = ''; 1797ab45ba71SJames Collins } 1798ab45ba71SJames Collins 1799ab45ba71SJames Collins foreach ($cm->find('fieldset') as $elm) { 1800ab45ba71SJames Collins $elm->innertext .= $saveButtons; 1801ab45ba71SJames Collins } 1802ab45ba71SJames Collins } 1803ab45ba71SJames Collins } 1804ab45ba71SJames Collins 1805ab45ba71SJames Collins $content = $html->save(); 1806c165b184SJames Collins $html->clear(); 1807c165b184SJames Collins unset($html); 1808c165b184SJames Collins 1809c165b184SJames Collins return $content; 1810c165b184SJames Collins } 18112b4583abSJames Collins 18122b4583abSJames Collins 1813a8eebd82SJames Collins /** 1814a8eebd82SJames Collins * Get DokuWiki namespace/page/URI as link 1815a8eebd82SJames Collins * 18169cff245bSJames Collins * @param string $str String to parse. 18179cff245bSJames Collins * @return string parsed URI 1818a8eebd82SJames Collins */ 18199cff245bSJames Collins public function getLink(string $str) 182010b40067Snomadjimbob { 18212b4583abSJames Collins $i = strpos($str, '://'); 18229cff245bSJames Collins if ($i !== false) { 18239cff245bSJames Collins return $str; 18249cff245bSJames Collins } 18252b4583abSJames Collins 18262b4583abSJames Collins return wl($str); 18272b4583abSJames Collins } 1828ab45ba71SJames Collins 1829ab45ba71SJames Collins 1830a8eebd82SJames Collins /** 1831a8eebd82SJames Collins * Check if the user can edit current namespace/page 1832a8eebd82SJames Collins * 1833a8eebd82SJames Collins * @return boolean user can edit 1834a8eebd82SJames Collins */ 183510b40067Snomadjimbob public function userCanEdit() 183610b40067Snomadjimbob { 1837ab45ba71SJames Collins global $INFO; 1838ab45ba71SJames Collins global $ID; 1839ab45ba71SJames Collins 1840ab45ba71SJames Collins $wiki_file = wikiFN($ID); 18419cff245bSJames Collins if (@file_exists($wiki_file) === false) { 18429cff245bSJames Collins return true; 18439cff245bSJames Collins } 18449cff245bSJames Collins if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) { 18459cff245bSJames Collins return true; 18469cff245bSJames Collins } 1847a8eebd82SJames Collins // $meta_file = metaFN($ID, '.meta'); 18489cff245bSJames Collins if ($INFO['meta']['user'] === false) { 18499cff245bSJames Collins return true; 18509cff245bSJames Collins } 18519cff245bSJames Collins if ($INFO['client'] === $INFO['meta']['user']) { 18529cff245bSJames Collins return true; 18539cff245bSJames Collins } 1854ab45ba71SJames Collins 1855ab45ba71SJames Collins return false; 1856c165b184SJames Collins } 185747161538SJames Collins 185847161538SJames Collins 1859a8eebd82SJames Collins /** 1860a8eebd82SJames Collins * Search for and return the uri of a media file 1861a8eebd82SJames Collins * 18629cff245bSJames Collins * @param string $image Image name to search for (without extension). 18639cff245bSJames Collins * @param boolean $searchCurrentNS Search the current namespace. 18649cff245bSJames Collins * @param boolean $propagate Propagate search through the namespace. 18659cff245bSJames Collins * @return string URI of the found media file 1866a8eebd82SJames Collins */ 18679cff245bSJames Collins public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true) 186810b40067Snomadjimbob { 1869ab45ba71SJames Collins global $INFO; 1870a8eebd82SJames Collins 18719cff245bSJames Collins $ext = ['png', 'jpg', 'gif', 'svg']; 1872ab45ba71SJames Collins 18739cff245bSJames Collins if ($searchCurrentNS === true) { 18749cff245bSJames Collins $prefix[] = ':' . $INFO['namespace'] . ':'; 18759cff245bSJames Collins } 18769cff245bSJames Collins if ($propagate === true) { 1877ab45ba71SJames Collins $prefix[] = ':'; 1878ab45ba71SJames Collins $prefix[] = ':wiki:'; 1879a8eebd82SJames Collins } 1880ab45ba71SJames Collins $theme = $this->getConf('customTheme'); 1881*3a385f2cSJames Collins if (empty($theme) === false) { 18829cff245bSJames Collins $prefix[] = 'themes/' . $theme . '/images/'; 18839cff245bSJames Collins } 1884ab45ba71SJames Collins $prefix[] = 'images/'; 1885ab45ba71SJames Collins 18869cff245bSJames Collins $search = []; 1887ab45ba71SJames Collins foreach ($prefix as $pitem) { 1888ab45ba71SJames Collins foreach ($ext as $eitem) { 1889ab45ba71SJames Collins $search[] = $pitem . $image . '.' . $eitem; 1890ab45ba71SJames Collins } 1891ab45ba71SJames Collins } 1892ab45ba71SJames Collins 1893ab45ba71SJames Collins $img = ''; 1894ab45ba71SJames Collins $file = ''; 1895ab45ba71SJames Collins $url = ''; 1896ab45ba71SJames Collins $ismedia = false; 1897ab45ba71SJames Collins $found = false; 1898ab45ba71SJames Collins 1899ab45ba71SJames Collins foreach ($search as $img) { 1900*3a385f2cSJames Collins if (strcasecmp(substr($img, 0, 1), ':') === 0) { 1901ab45ba71SJames Collins $file = mediaFN($img); 1902ab45ba71SJames Collins $ismedia = true; 1903ab45ba71SJames Collins } else { 1904ab45ba71SJames Collins $file = tpl_incdir() . $img; 1905ab45ba71SJames Collins $ismedia = false; 1906ab45ba71SJames Collins } 1907ab45ba71SJames Collins 19089cff245bSJames Collins if (file_exists($file) === true) { 1909ab45ba71SJames Collins $found = true; 1910ab45ba71SJames Collins break; 1911ab45ba71SJames Collins } 1912ab45ba71SJames Collins } 1913ab45ba71SJames Collins 19149cff245bSJames Collins if ($found === false) { 19159cff245bSJames Collins return false; 19169cff245bSJames Collins } 1917ab45ba71SJames Collins 19189cff245bSJames Collins if ($ismedia === true) { 1919ab45ba71SJames Collins $url = ml($img, '', true, '', false); 1920ab45ba71SJames Collins } else { 1921ab45ba71SJames Collins $url = tpl_basedir() . $img; 1922ab45ba71SJames Collins } 1923ab45ba71SJames Collins 1924ab45ba71SJames Collins return $url; 1925ab45ba71SJames Collins } 1926ab45ba71SJames Collins 1927a8eebd82SJames Collins 1928a8eebd82SJames Collins /** 1929ab45ba71SJames Collins * Print or return the page title 1930ab45ba71SJames Collins * 19319cff245bSJames Collins * @param string $page Page id or empty string for current page. 1932ab45ba71SJames Collins * @return string generated content 1933ab45ba71SJames Collins */ 19349cff245bSJames Collins public function getPageTitle(string $page = '') 193510b40067Snomadjimbob { 1936ab45ba71SJames Collins global $ID, $conf; 1937ab45ba71SJames Collins 1938ab45ba71SJames Collins $html = ''; 1939ab45ba71SJames Collins 1940*3a385f2cSJames Collins if (empty($page) === true) { 19419cff245bSJames Collins $page = $ID; 19429cff245bSJames Collins } 1943ab45ba71SJames Collins 1944ab45ba71SJames Collins $html = p_get_first_heading($page); 1945ab45ba71SJames Collins $html = strip_tags($html); 1946ab45ba71SJames Collins $html = preg_replace('/\s+/', ' ', $html); 1947ab45ba71SJames Collins $html .= ' [' . strip_tags($conf['title']) . ']'; 1948ab45ba71SJames Collins $html = trim($html); 1949ab45ba71SJames Collins 1950ab45ba71SJames Collins return $html; 1951ab45ba71SJames Collins } 1952a8eebd82SJames Collins 1953a8eebd82SJames Collins 1954a8eebd82SJames Collins /** 1955a8eebd82SJames Collins * Return inline theme icon 1956a8eebd82SJames Collins * 19579cff245bSJames Collins * @param string $type Icon to retreive. 19589cff245bSJames Collins * @return string HTML icon content 1959a8eebd82SJames Collins */ 19609cff245bSJames Collins public function mikioInlineIcon(string $type) 196110b40067Snomadjimbob { 1962a8eebd82SJames Collins switch ($type) { 1963a8eebd82SJames Collins case 'wrench': 19649cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 19659cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,53.152542,1217.0847)"><path d="m 384,64 q 0,26 -19,45 -19,19 19669cff245bSJames Collins-45,19 -26,0 -45,-19 -19,-19 -19,-45 0,-26 19,-45 19,-19 45,-19 26,0 45,19 19,19 19,45 z m 644,420 -682,-682 q -37,-37 19679cff245bSJames Collins-90,-37 -52,0 -91,37 L 59,-90 Q 21,-54 21,0 21,53 59,91 L 740,772 Q 779,674 854.5,598.5 930,523 1028,484 z m 634,435 q 19689cff245bSJames Collins0,-39 -23,-106 Q 1592,679 1474.5,595.5 1357,512 1216,512 1031,512 899.5,643.5 768,775 768,960 q 0,185 131.5,316.5 131.5, 19699cff245bSJames Collins131.5 316.5,131.5 58,0 121.5,-16.5 63.5,-16.5 107.5,-46.5 16,-11 16,-28 0,-17 -16,-28 L 1152,1120 V 896 l 193,-107 q 5, 19709cff245bSJames Collins3 79,48.5 74,45.5 135.5,81 61.5,35.5 70.5,35.5 15,0 23.5,-10 8.5,-10 8.5,-25 z"/></g></svg>'; 1971a8eebd82SJames Collins case 'file': 19729cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 19739cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991"><path d="M 128,0 H 1152 V 768 19749cff245bSJames CollinsH 736 q -40,0 -68,28 -28,28 -28,68 v 416 H 128 V 0 z m 640,896 h 299 L 768,1195 V 896 z M 1280,768 V -32 q 0,-40 -28, 19759cff245bSJames Collins-68 -28,-28 -68,-28 H 96 q -40,0 -68,28 -28,28 -28,68 v 1344 q 0,40 28,68 28,28 68,28 h 544 q 40,0 88,-20 48,-20 76,-48 19769cff245bSJames Collinsl 408,-408 q 28,-28 48,-76 20,-48 20,-88 z" id="path2993" inkscape:connector-curvature="0" 19779cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 1978a8eebd82SJames Collins case 'gear': 19799cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 19809cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027"><path d="m 1024,640 q 0,106 19819cff245bSJames Collins-75,181 -75,75 -181,75 -106,0 -181,-75 -75,-75 -75,-181 0,-106 75,-181 75,-75 181,-75 106,0 181,75 75,75 75,181 z m 19829cff245bSJames Collins512,109 V 527 q 0,-12 -8,-23 -8,-11 -20,-13 l -185,-28 q -19,-54 -39,-91 35,-50 107,-138 10,-12 10,-25 0,-13 -9,-23 -27, 19839cff245bSJames Collins-37 -99,-108 -72,-71 -94,-71 -12,0 -26,9 l -138,108 q -44,-23 -91,-38 -16,-136 -29,-186 -7,-28 -36,-28 H 657 q -14,0 19849cff245bSJames Collins-24.5,8.5 Q 622,-111 621,-98 L 593,86 q -49,16 -90,37 L 362,16 Q 352,7 337,7 323,7 312,18 186,132 147,186 q -7,10 -7,23 19859cff245bSJames Collins0,12 8,23 15,21 51,66.5 36,45.5 54,70.5 -27,50 -41,99 L 29,495 Q 16,497 8,507.5 0,518 0,531 v 222 q 0,12 8,23 8,11 19, 19869cff245bSJames Collins13 l 186,28 q 14,46 39,92 -40,57 -107,138 -10,12 -10,24 0,10 9,23 26,36 98.5,107.5 72.5,71.5 94.5,71.5 13,0 26,-10 l 19879cff245bSJames Collins138,-107 q 44,23 91,38 16,136 29,186 7,28 36,28 h 222 q 14,0 24.5,-8.5 Q 914,1391 915,1378 l 28,-184 q 49,-16 90,-37 l 19889cff245bSJames Collins142,107 q 9,9 24,9 13,0 25,-10 129,-119 165,-170 7,-8 7,-22 0,-12 -8,-23 -15,-21 -51,-66.5 -36,-45.5 -54,-70.5 26,-50 19899cff245bSJames Collins41,-98 l 183,-28 q 13,-2 21,-12.5 8,-10.5 8,-23.5 z" id="path3029" inkscape:connector-curvature="0" /></g></svg>'; 1990a8eebd82SJames Collins case 'user': 19919cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 19929cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M 1408,131 Q 1408,11 1335,-58.5 19939cff245bSJames Collins1262,-128 1141,-128 H 267 Q 146,-128 73,-58.5 0,11 0,131 0,184 3.5,234.5 7,285 17.5,343.5 28,402 44,452 q 16,50 43,97.5 19949cff245bSJames Collins27,47.5 62,81 35,33.5 85.5,53.5 50.5,20 111.5,20 9,0 42,-21.5 33,-21.5 74.5,-48 41.5,-26.5 108,-48 Q 637,565 704,565 q 19959cff245bSJames Collins67,0 133.5,21.5 66.5,21.5 108,48 41.5,26.5 74.5,48 33,21.5 42,21.5 61,0 111.5,-20 50.5,-20 85.5,-53.5 35,-33.5 62,-81 19969cff245bSJames Collins27,-47.5 43,-97.5 16,-50 26.5,-108.5 10.5,-58.5 14,-109 Q 1408,184 1408,131 z m -320,893 Q 1088,865 975.5,752.5 863,640 19979cff245bSJames Collins704,640 545,640 432.5,752.5 320,865 320,1024 320,1183 432.5,1295.5 545,1408 704,1408 863,1408 975.5,1295.5 1088,1183 19989cff245bSJames Collins1088,1024 z"/></g></svg>'; 1999a8eebd82SJames Collins case 'search': 20009cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" 20019cff245bSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M27 24.57l-5.647-5.648a8.895 8.895 0 0 0 1.522-4.984C22.875 9.01 20029cff245bSJames Collins18.867 5 13.938 5 9.01 5 5 9.01 5 13.938c0 4.929 4.01 8.938 8.938 8.938a8.887 8.887 0 0 0 4.984-1.522L24.568 27 27 20039cff245bSJames Collins24.57zm-13.062-4.445a6.194 6.194 0 0 1-6.188-6.188 6.195 6.195 0 0 1 6.188-6.188 6.195 6.195 0 0 1 6.188 6.188 6.195 20049cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>'; 2005a8eebd82SJames Collins case 'home': 20069cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 20079cff245bSJames Collinsaria-hidden="true" style="fill:currentColor"><g transform="matrix(1,0,0,-1,68.338983,1285.4237)" id="g3015"> 20089cff245bSJames Collins<path d="M 1408,544 V 64 Q 1408,38 1389,19 1370,0 1344,0 H 960 V 384 H 704 V 0 H 320 q -26,0 -45,19 -19,19 -19, 20099cff245bSJames Collins45 v 480 q 0,1 0.5,3 0.5,2 0.5,3 l 575,474 575,-474 q 1,-2 1,-6 z m 223,69 -62,-74 q -8,-9 -21,-11 h -3 q -13, 20109cff245bSJames Collins0 -21,7 L 832,1112 140,535 q -12,-8 -24,-7 -13,2 -21,11 l -62,74 q -8,10 -7,23.5 1,13.5 11,21.5 l 719, 20119cff245bSJames Collins599 q 32,26 76,26 44,0 76,-26 l 244,-204 v 195 q 0,14 9,23 9,9 23,9 h 192 q 14,0 23,-9 9,-9 9,-23 V 840 l 219, 20129cff245bSJames Collins-182 q 10,-8 11,-21.5 1,-13.5 -7,-23.5 z" id="path3017" inkscape:connector-curvature="0" 20139cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 20149cff245bSJames Collins }//end switch 2015ab45ba71SJames Collins 2016a8eebd82SJames Collins return ''; 2017a8eebd82SJames Collins } 2018ab45ba71SJames Collins 2019a8eebd82SJames Collins /** 2020a8eebd82SJames Collins * Finalize theme 20219cff245bSJames Collins * 20229cff245bSJames Collins * @return void 2023a8eebd82SJames Collins */ 202410b40067Snomadjimbob public function finalize() 202510b40067Snomadjimbob { 2026a8eebd82SJames Collins } 20271785fc73SJames Collins 20281785fc73SJames Collins /** 20291785fc73SJames Collins * Show Messages 20309cff245bSJames Collins * 20319cff245bSJames Collins * @return void 20321785fc73SJames Collins */ 203310b40067Snomadjimbob public function showMessages() 203410b40067Snomadjimbob { 20351785fc73SJames Collins global $ACT; 20361785fc73SJames Collins 20379cff245bSJames Collins if ($this->lessIgnored === true) { 20389cff245bSJames Collins msg( 20399cff245bSJames Collins 'useLESS is enabled on the Mikio template, however is not supported on this server', 20409cff245bSJames Collins 2, 20419cff245bSJames Collins '', 20429cff245bSJames Collins '', 20439cff245bSJames Collins MSG_ADMINS_ONLY 20449cff245bSJames Collins ); 2045a8df40efSJames Collins } 2046a8df40efSJames Collins 20471785fc73SJames Collins $show = $this->getConf('showNotifications'); 2048*3a385f2cSJames Collins if ( 2049*3a385f2cSJames Collins strcasecmp($show, 'always') === 0 || 2050*3a385f2cSJames Collins (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0) 2051*3a385f2cSJames Collins ) { 20521785fc73SJames Collins global $MSG, $MSG_shown; 20531785fc73SJames Collins 20549cff245bSJames Collins if (isset($MSG) === false) { 20551785fc73SJames Collins return; 20561785fc73SJames Collins } 20571785fc73SJames Collins 20589cff245bSJames Collins if (isset($MSG_shown) === false) { 20599cff245bSJames Collins $MSG_shown = []; 2060a8df40efSJames Collins } 20611785fc73SJames Collins 20621785fc73SJames Collins foreach ($MSG as $msg) { 20631785fc73SJames Collins $hash = md5($msg['msg']); 20649cff245bSJames Collins if (isset($MSG_shown[$hash]) === true) { 20651785fc73SJames Collins continue; 20661785fc73SJames Collins } 20671785fc73SJames Collins // skip double messages 20681785fc73SJames Collins 20699cff245bSJames Collins if (info_msg_allowed($msg) === true) { 20709cff245bSJames Collins echo '<div class="' . $msg['lvl'] . '">'; 20719cff245bSJames Collins echo $msg['msg']; 20729cff245bSJames Collins echo '</div>'; 20731785fc73SJames Collins } 20741785fc73SJames Collins 2075a8df40efSJames Collins $MSG_shown[$hash] = true; 20761785fc73SJames Collins } 20771785fc73SJames Collins 20781785fc73SJames Collins unset($GLOBALS['MSG']); 20799cff245bSJames Collins }//end if 20801785fc73SJames Collins } 20817ac0a6efSJames Collins 20827ac0a6efSJames Collins /** 20837ac0a6efSJames Collins * Dokuwiki version 20847ac0a6efSJames Collins * 20857ac0a6efSJames Collins * @return string the dw version name 20867ac0a6efSJames Collins */ 20879cff245bSJames Collins public function dwVersion() 20889cff245bSJames Collins { 20899cff245bSJames Collins if (function_exists('getVersionData') === true) { 20907ac0a6efSJames Collins $version_data = getVersionData(); 20919cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 20927ac0a6efSJames Collins $version_items = explode(' ', $version_data['date']); 20937ac0a6efSJames Collins if (count($version_items) >= 2) { 20947ac0a6efSJames Collins return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1])); 20957ac0a6efSJames Collins } 20967ac0a6efSJames Collins } 20977ac0a6efSJames Collins } 20987ac0a6efSJames Collins 20997ac0a6efSJames Collins return 'unknown'; 21007ac0a6efSJames Collins } 2101e4c4fb13SJames Collins 2102e4c4fb13SJames Collins /** 2103e4c4fb13SJames Collins * Dokuwiki version number 2104e4c4fb13SJames Collins * 2105e4c4fb13SJames Collins * @return string the dw version date converted to integer 2106e4c4fb13SJames Collins */ 21079cff245bSJames Collins public function dwVersionNumber() 21089cff245bSJames Collins { 21099cff245bSJames Collins if (function_exists('getVersionData') === true) { 2110e4c4fb13SJames Collins $version_data = getVersionData(); 21119cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 2112e4c4fb13SJames Collins $version_items = explode(' ', $version_data['date']); 2113e4c4fb13SJames Collins if (count($version_items) >= 1) { 2114e4c4fb13SJames Collins return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0]))); 2115e4c4fb13SJames Collins } 2116e4c4fb13SJames Collins } 2117e4c4fb13SJames Collins } 2118e4c4fb13SJames Collins 2119e4c4fb13SJames Collins return 0; 2120e4c4fb13SJames Collins } 2121a8eebd82SJames Collins} 2122ab45ba71SJames Collins 2123ab45ba71SJames Collinsglobal $TEMPLATE; 212447161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance(); 2125