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 13*9cff245bSJames Collinsif (defined('DOKU_INC') === false) { 14*9cff245bSJames Collins die(); 15*9cff245bSJames Collins} 16c165b184SJames Collins 17ab45ba71SJames Collinsrequire_once('icons/icons.php'); 18c165b184SJames Collinsrequire_once('inc/simple_html_dom.php'); 19c165b184SJames Collins 2010b40067Snomadjimbobclass Template 2110b40067Snomadjimbob{ 22*9cff245bSJames Collins /** 23*9cff245bSJames Collins * @var string Template directory path from local FS. 24*9cff245bSJames Collins */ 25c165b184SJames Collins public $tplDir = ''; 26*9cff245bSJames Collins 27*9cff245bSJames Collins /** 28*9cff245bSJames Collins * @var string Template directory path from web. 29*9cff245bSJames Collins */ 30c165b184SJames Collins public $baseDir = ''; 31*9cff245bSJames Collins 32*9cff245bSJames Collins /** 33*9cff245bSJames Collins * @var array Array of Javascript files to include in footer. 34*9cff245bSJames Collins */ 35*9cff245bSJames Collins public $footerScript = []; 36*9cff245bSJames Collins 37*9cff245bSJames Collins /** 38*9cff245bSJames Collins * @var boolean Ignore LESS files. 39*9cff245bSJames 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 51*9cff245bSJames 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 6447161538SJames Collins if ($instance === null) { 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 74*9cff245bSJames Collins * 75*9cff245bSJames Collins * @return void 76c165b184SJames Collins */ 77*9cff245bSJames Collins private function registerHooks() 7810b40067Snomadjimbob { 79c165b184SJames Collins global $EVENT_HANDLER; 80c165b184SJames Collins 81*9cff245bSJames Collins $events_dispatcher = [ 82ab45ba71SJames Collins 'TPL_METAHEADER_OUTPUT' => 'metaheadersHandler' 83*9cff245bSJames 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 * 94*9cff245bSJames Collins * @param \Doku_Event $event DokuWiki Event. 95*9cff245bSJames Collins * @return void 96c165b184SJames Collins */ 9710b40067Snomadjimbob public function metaHeadersHandler(\Doku_Event $event) 9810b40067Snomadjimbob { 99ab45ba71SJames Collins global $MIKIO_ICONS; 100b5536b07SChris MacMackin global $conf; 101ab45ba71SJames Collins 102*9cff245bSJames Collins $this->includePage('theme', false, true); 103a8eebd82SJames Collins 104*9cff245bSJames Collins $stylesheets = []; 105*9cff245bSJames Collins $scripts = []; 106c165b184SJames Collins 107*9cff245bSJames Collins if ($this->getConf('customTheme') !== '') { 108*9cff245bSJames 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 { 111*9cff245bSJames 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 } 115*9cff245bSJames 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*9cff245bSJames Collins if (is_array($MIKIO_ICONS) === true && $this->getConf('iconTag', 'icon') !== '') { 121*9cff245bSJames Collins $icons = []; 122ab45ba71SJames Collins foreach ($MIKIO_ICONS as $icon) { 123*9cff245bSJames Collins if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) { 124ab45ba71SJames Collins $icons[] = $icon; 125c165b184SJames Collins 126*9cff245bSJames Collins if ($icon['css'] !== '') { 127*9cff245bSJames 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 143*9cff245bSJames 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) { 152*9cff245bSJames Collins if (in_array($style, $set) === false) { 153*9cff245bSJames Collins if (strtolower(substr($style, -5)) === '.less' && $this->getConf('useLESS') === true) { 154ab45ba71SJames Collins $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style); 155ab45ba71SJames Collins } 156ab45ba71SJames Collins 157*9cff245bSJames Collins array_unshift($event->data['link'], [ 158c165b184SJames Collins 'type' => 'text/css', 159c165b184SJames Collins 'rel' => 'stylesheet', 160c165b184SJames Collins 'href' => $style 161*9cff245bSJames Collins ]); 162c165b184SJames Collins } 163ab45ba71SJames Collins $set[] = $style; 164ab45ba71SJames Collins } 165c165b184SJames Collins 166ab45ba71SJames Collins $set = []; 167c165b184SJames Collins foreach ($scripts as $script) { 168*9cff245bSJames Collins if (in_array($script, $set) === false) { 169*9cff245bSJames Collins $script_params = [ 170c165b184SJames Collins 'type' => 'text/javascript', 171c165b184SJames Collins '_data' => '', 1728395cdcbSChris MacMackin 'src' => $script 173*9cff245bSJames 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 182*9cff245bSJames 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; 189*9cff245bSJames Collins }//end if 190ab45ba71SJames Collins $set[] = $script; 191*9cff245bSJames Collins }//end foreach 192c165b184SJames Collins } 193c165b184SJames Collins 194c165b184SJames Collins 195c165b184SJames Collins /** 196a8eebd82SJames Collins * Print or return the footer meta data 197c165b184SJames Collins * 198*9cff245bSJames Collins * @param boolean $print Print the data to buffer. 199*9cff245bSJames Collins * @return string HTML footer meta data 200c165b184SJames Collins */ 201*9cff245bSJames 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 214*9cff245bSJames Collins if ($print === true) { 215*9cff245bSJames Collins echo $html; 216*9cff245bSJames Collins } 217a8eebd82SJames Collins return $html; 218a8eebd82SJames Collins } 219a8eebd82SJames Collins 220a8eebd82SJames Collins /** 221ab45ba71SJames Collins * Retreive and parse theme configuration options 222c165b184SJames Collins * 223*9cff245bSJames Collins * @param string $key The configuration key to retreive. 224*9cff245bSJames Collins * @param mixed $default If key doesn't exist, return this value. 225ab45ba71SJames Collins * @return mixed parsed value of configuration 226c165b184SJames Collins */ 227*9cff245bSJames Collins public function getConf(string $key, mixed $default = false) 22810b40067Snomadjimbob { 229c165b184SJames Collins $value = tpl_getConf($key, $default); 230c165b184SJames Collins 231a8eebd82SJames Collins switch ($key) { 232a8eebd82SJames Collins case 'navbarDWMenuType': 233a8eebd82SJames Collins $value = strtolower($value); 234*9cff245bSJames Collins if ($value !== 'icons' && $value !== 'text' && $value !== 'both') { 235*9cff245bSJames Collins $value = 'both'; 236*9cff245bSJames Collins } 237a8eebd82SJames Collins break; 238a8eebd82SJames Collins case 'navbarDWMenuCombine': 239a8eebd82SJames Collins $value = strtolower($value); 240*9cff245bSJames Collins if ($value !== 'seperate' && $value !== 'dropdown' && $value !== 'combine') { 241*9cff245bSJames Collins $value = 'combine'; 242*9cff245bSJames Collins } 243a8eebd82SJames Collins break; 244a8eebd82SJames Collins case 'navbarPosLeft': 245a8eebd82SJames Collins case 'navbarPosMiddle': 246a8eebd82SJames Collins case 'navbarPosRight': 247a8eebd82SJames Collins $value = strtolower($value); 248*9cff245bSJames Collins if ($value !== 'none' && $value !== 'custom' && $value !== 'search' && $value !== 'dokuwiki') { 249*9cff245bSJames Collins if ($key === 'navbarPosLeft') { 250*9cff245bSJames Collins $value = 'none'; 251*9cff245bSJames Collins } 252*9cff245bSJames Collins if ($key === 'navbarPosMiddle') { 253*9cff245bSJames Collins $value = 'search'; 254*9cff245bSJames Collins } 255*9cff245bSJames Collins if ($key === 'navbarPosRight') { 256*9cff245bSJames Collins $value = 'dokuwiki'; 257*9cff245bSJames Collins } 258a8eebd82SJames Collins } 259a8eebd82SJames Collins break; 260931c46e6SJames Collins case 'navbarItemShowCreate': 261931c46e6SJames Collins case 'navbarItemShowShow': 262931c46e6SJames Collins case 'navbarItemShowRevs': 263931c46e6SJames Collins case 'navbarItemShowBacklink': 264931c46e6SJames Collins case 'navbarItemShowRecent': 265931c46e6SJames Collins case 'navbarItemShowMedia': 266931c46e6SJames Collins case 'navbarItemShowIndex': 267931c46e6SJames Collins case 'navbarItemShowProfile': 268931c46e6SJames Collins case 'navbarItemShowAdmin': 269931c46e6SJames Collins $value = strtolower($value); 270*9cff245bSJames Collins if ($value !== 'always' && $value !== 'logged in' && $value !== 'logged out' && $value !== 'never') { 271931c46e6SJames Collins $value = 'always'; 272931c46e6SJames Collins } 273931c46e6SJames Collins break; 274931c46e6SJames Collins case 'navbarItemShowLogin': 275931c46e6SJames Collins case 'navbarItemShowLogout': 276931c46e6SJames Collins $value = strtolower($value); 277*9cff245bSJames Collins if ($value !== 'always' && $value !== 'never') { 278931c46e6SJames Collins $value = 'always'; 279931c46e6SJames Collins } 280931c46e6SJames Collins break; 281a8eebd82SJames Collins case 'searchButton': 282a8eebd82SJames Collins $value = strtolower($value); 283*9cff245bSJames Collins if ($value !== 'icon' && $value !== 'text') { 284*9cff245bSJames Collins $value = 'icon'; 285*9cff245bSJames Collins } 286a8eebd82SJames Collins break; 287a8eebd82SJames Collins case 'searchButton': 288a8eebd82SJames Collins $value = strtolower($value); 289*9cff245bSJames Collins if ($value !== 'icon' && $value !== 'text') { 290*9cff245bSJames Collins $value = 'icon'; 291*9cff245bSJames Collins } 292a8eebd82SJames Collins break; 293a8eebd82SJames Collins case 'breadcrumbPosition': 294a8eebd82SJames Collins $value = strtolower($value); 295*9cff245bSJames Collins if ($value !== 'none' && $value !== 'top' && $value !== 'hero' && $value !== 'page') { 296*9cff245bSJames Collins $value = 'top'; 297*9cff245bSJames Collins } 298a8eebd82SJames Collins break; 2993d11a778SJames Collins case 'youareherePosition': 3003d11a778SJames Collins $value = strtolower($value); 301*9cff245bSJames Collins if ($value !== 'none' && $value !== 'top' && $value !== 'hero' && $value !== 'page') { 302*9cff245bSJames Collins $value = 'top'; 303*9cff245bSJames Collins } 3043d11a778SJames Collins break; 3053d11a778SJames Collins case 'youarehereHome': 306a8eebd82SJames Collins $value = strtolower($value); 307*9cff245bSJames Collins if ($value !== 'none' && $value !== 'page title' && $value !== 'home' && $value !== 'icon') { 308*9cff245bSJames Collins $value = 'page title'; 309*9cff245bSJames Collins } 310a8eebd82SJames Collins break; 311a8eebd82SJames Collins case 'sidebarLeftRow1': 312a8eebd82SJames Collins case 'sidebarLeftRow2': 313a8eebd82SJames Collins case 'sidebarLeftRow3': 314a8eebd82SJames Collins case 'sidebarLeftRow4': 315a8eebd82SJames Collins $value = strtolower($value); 316*9cff245bSJames Collins if ( 317*9cff245bSJames Collins $value !== 'none' && $value !== 'logged in user' && $value !== 'search' && $value !== 'content' && 318*9cff245bSJames Collins $value !== 'tags' 319*9cff245bSJames Collins ) { 320*9cff245bSJames Collins if ($key === 'sidebarLeftRow1') { 321*9cff245bSJames Collins $value = 'logged in user'; 322*9cff245bSJames Collins } 323*9cff245bSJames Collins if ($key === 'sidebarLeftRow2') { 324*9cff245bSJames Collins $value = 'search'; 325*9cff245bSJames Collins } 326*9cff245bSJames Collins if ($key === 'sidebarLeftRow3') { 327*9cff245bSJames Collins $value = 'content'; 328*9cff245bSJames Collins } 329*9cff245bSJames Collins if ($key === 'sidebarLeftRow4') { 330*9cff245bSJames Collins $value = 'none'; 331*9cff245bSJames Collins } 332a8eebd82SJames Collins } 333a8eebd82SJames Collins break; 334a8eebd82SJames Collins case 'pageToolsFloating': 335a8eebd82SJames Collins case 'pageToolsFooter': 336a8eebd82SJames Collins $value = strtolower($value); 337*9cff245bSJames Collins if ($value !== 'none' && $value !== 'page editors' && $value !== 'always') { 338*9cff245bSJames Collins if ($key === 'pageToolsFloating') { 339*9cff245bSJames Collins $value = 'always'; 340*9cff245bSJames Collins } 341*9cff245bSJames Collins if ($key === 'pageToolsFooter') { 342*9cff245bSJames Collins $value = 'always'; 343*9cff245bSJames Collins } 344a8eebd82SJames Collins } 345a8eebd82SJames Collins break; 3461293ce10SJames Collins case 'pageToolsShowCreate': 3471293ce10SJames Collins case 'pageToolsShowEdit': 3481293ce10SJames Collins case 'pageToolsShowRevs': 3491293ce10SJames Collins case 'pageToolsShowBacklink': 3501293ce10SJames Collins case 'pageToolsShowTop': 3511293ce10SJames Collins $value = strtolower($value); 352*9cff245bSJames Collins if ($value !== 'always' && $value !== 'logged in' && $value !== 'logged out' && $value !== 'never') { 3531293ce10SJames Collins $value = 'always'; 3541293ce10SJames Collins } 3551293ce10SJames Collins break; 3561785fc73SJames Collins case 'showNotifications': 3571785fc73SJames Collins $value = strtolower($value); 358*9cff245bSJames Collins if ($value !== 'none' && $value !== 'admin' && $value !== 'always') { 359*9cff245bSJames Collins $value = 'admin'; 360*9cff245bSJames Collins } 3611785fc73SJames Collins break; 362a8eebd82SJames Collins case 'licenseType': 363a8eebd82SJames Collins $value = strtolower($value); 364*9cff245bSJames Collins if ($value !== 'none' && $value !== 'badge' && $value !== 'buttom') { 365*9cff245bSJames Collins $value = 'badge'; 366*9cff245bSJames Collins } 367a8eebd82SJames Collins break; 368a8eebd82SJames Collins case 'navbarUseTitleIcon': 369a8eebd82SJames Collins case 'navbarUseTitleText': 370a8eebd82SJames Collins case 'navbarUseTaglineText': 371a8eebd82SJames Collins case 'navbarShowSub': 372a8eebd82SJames Collins case 'heroTitle': 373a8eebd82SJames Collins case 'heroImagePropagation': 374a8eebd82SJames Collins case 'breadcrumbPrefix': 375a8eebd82SJames Collins case 'breadcrumbSep': 376df74502dSJames Collins case 'youareherePrefix': 377df74502dSJames Collins case 'youarehereSep': 378a8eebd82SJames Collins case 'sidebarShowLeft': 379a8eebd82SJames Collins case 'sidebarShowRight': 380a8eebd82SJames Collins case 'tocFull': 381a8eebd82SJames Collins case 'footerSearch': 382a8eebd82SJames Collins case 'licenseImageOnly': 383a8eebd82SJames Collins case 'includePageUseACL': 384a8eebd82SJames Collins case 'includePagePropagate': 385df74502dSJames Collins case 'youarehereHideHome': 386a8eebd82SJames Collins case 'tagsConsolidate': 3879345b902SJames Collins case 'footerInPage': 38854fe5c98SJames Collins case 'sidebarMobileDefaultCollapse': 3893a04a100SJames Collins case 'sidebarAlwaysShowLeft': 3903a04a100SJames Collins case 'sidebarAlwaysShowRight': 391b0326138SJames Collins case 'searchUseTypeahead': 392a8eebd82SJames Collins $value = (bool) $value; 393a8eebd82SJames Collins break; 3943d11a778SJames Collins case 'youarehereShowLast': 395a8eebd82SJames Collins $value = (int) $value; 396a8eebd82SJames Collins break; 397a8eebd82SJames Collins case 'iconTag': 398a8eebd82SJames Collins case 'customTheme': 399a8eebd82SJames Collins case 'navbarCustomMenuText': 400a8eebd82SJames Collins case 'breadcrumbPrefixText': 401a8eebd82SJames Collins case 'breadcrumbSepText': 402df74502dSJames Collins case 'youareherePrefixText': 403df74502dSJames Collins case 'youarehereSepText': 404a8eebd82SJames Collins case 'footerCustomMenuText': 405b39ad16dSJames Collins case 'brandURLGuest': 406b39ad16dSJames Collins case 'brandURLUser': 407a8eebd82SJames Collins break; 40829118ed7SJames Collins case 'useLESS': 40929118ed7SJames Collins $value = (bool) $value; 410a8df40efSJames Collins $lessAvailable = true; 411a8df40efSJames Collins 412a8df40efSJames Collins // check for less library 413a8df40efSJames Collins $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php'; 414*9cff245bSJames Collins if (file_exists($lesscLib) === false) { 415a8df40efSJames Collins $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 416*9cff245bSJames Collins } 417*9cff245bSJames Collins if (file_exists($lesscLib) === false) { 418a8df40efSJames Collins $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 419*9cff245bSJames Collins } 420*9cff245bSJames Collins if (file_exists($lesscLib) === false) { 421*9cff245bSJames Collins $lesscLib = $_SERVER['DOCUMENT_ROOT'] . 422*9cff245bSJames Collins '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 423*9cff245bSJames Collins } 424*9cff245bSJames Collins if (file_exists($lesscLib) === false) { 425a8df40efSJames Collins $lessAvailable = false; 426a8df40efSJames Collins } 427a8df40efSJames Collins 428a8df40efSJames Collins // check for ctype extensions 429*9cff245bSJames Collins if (function_exists('ctype_digit') === false) { 430a8df40efSJames Collins $lessAvailable = false; 431a8df40efSJames Collins } 432a8df40efSJames Collins 433*9cff245bSJames Collins if ($value === true && $lessAvailable === false) { 434a8df40efSJames Collins $this->lessIgnored = true; 43529118ed7SJames Collins $value = false; 43629118ed7SJames Collins } 43729118ed7SJames Collins break; 438*9cff245bSJames Collins }//end switch 439c165b184SJames Collins 440c165b184SJames Collins return $value; 441c165b184SJames Collins } 442c165b184SJames Collins 443c165b184SJames Collins 444c165b184SJames Collins /** 445a8eebd82SJames Collins * Check if a page exist in directory or namespace 446c165b184SJames Collins * 447*9cff245bSJames Collins * @param string $page Page/namespace to search. 448a8eebd82SJames Collins * @return boolean if page exists 449c165b184SJames Collins */ 450*9cff245bSJames Collins public function pageExists(string $page) 45110b40067Snomadjimbob { 452ab45ba71SJames Collins ob_start(); 453a8eebd82SJames Collins tpl_includeFile($page . '.html'); 454ab45ba71SJames Collins $html = ob_get_contents(); 455ab45ba71SJames Collins ob_end_clean(); 456a8eebd82SJames Collins 457*9cff245bSJames Collins if ($html !== '') { 458*9cff245bSJames Collins return true; 459*9cff245bSJames Collins } 460a8eebd82SJames Collins 461a8eebd82SJames Collins $useACL = $this->getConf('includePageUseACL'); 462a8eebd82SJames Collins $propagate = $this->getConf('includePagePropagate'); 463a8eebd82SJames Collins 464*9cff245bSJames Collins if ($propagate === true) { 465*9cff245bSJames Collins if (page_findnearest($page, $useACL) !== false) { 466*9cff245bSJames Collins return true; 467*9cff245bSJames Collins } 468*9cff245bSJames Collins } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) { 469*9cff245bSJames Collins return true; 470ab45ba71SJames Collins } 471ab45ba71SJames Collins 472*9cff245bSJames Collins return false; 473ab45ba71SJames Collins } 474ab45ba71SJames Collins 475a8eebd82SJames Collins 476c165b184SJames Collins /** 477a8eebd82SJames Collins * Print or return page from directory or namespace 4782b4583abSJames Collins * 479*9cff245bSJames Collins * @param string $page Page/namespace to include. 480*9cff245bSJames Collins * @param boolean $print Print content. 481*9cff245bSJames Collins * @param boolean $parse Parse content before printing/returning. 482*9cff245bSJames Collins * @param string $classWrapper Wrap page in a div with class. 483ab45ba71SJames Collins * @return string contents of page found 4842b4583abSJames Collins */ 485*9cff245bSJames Collins public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '') 4862b4583abSJames Collins { 487a8eebd82SJames Collins ob_start(); 488a8eebd82SJames Collins tpl_includeFile($page . '.html'); 489a8eebd82SJames Collins $html = ob_get_contents(); 490a8eebd82SJames Collins ob_end_clean(); 491a8eebd82SJames Collins 492*9cff245bSJames Collins if ($html === '') { 493a8eebd82SJames Collins $useACL = $this->getConf('includePageUseACL'); 494a8eebd82SJames Collins $propagate = $this->getConf('includePagePropagate'); 495ab45ba71SJames Collins $html = ''; 4962b4583abSJames Collins 497ab45ba71SJames Collins $html = tpl_include_page($page, false, $propagate, $useACL); 498ab45ba71SJames Collins } 4992b4583abSJames Collins 500*9cff245bSJames Collins if ($html !== '' && $parse === true) { 501ab45ba71SJames Collins $html = $this->parseContent($html); 502ab45ba71SJames Collins } 5032b4583abSJames Collins 504*9cff245bSJames Collins if ($classWrapper !== '' && $html !== '') { 505*9cff245bSJames Collins $html = '<div class="' . $classWrapper . '">' . $html . '</div>'; 506*9cff245bSJames Collins } 5072b4583abSJames Collins 508*9cff245bSJames Collins if ($print === true) { 509*9cff245bSJames Collins echo $html; 510*9cff245bSJames Collins } 511ab45ba71SJames Collins return $html; 5122b4583abSJames Collins } 5132b4583abSJames Collins 514a8eebd82SJames Collins 515a8eebd82SJames Collins /** 516a8eebd82SJames Collins * Print or return logged in user information 517a8eebd82SJames Collins * 518*9cff245bSJames Collins * @param boolean $print Print content. 519a8eebd82SJames Collins * @return string user information 520a8eebd82SJames Collins */ 521*9cff245bSJames Collins public function includeLoggedIn(bool $print = true) 52210b40067Snomadjimbob { 523a8eebd82SJames Collins $html = ''; 524a8eebd82SJames Collins 525*9cff245bSJames Collins if (empty($_SERVER['REMOTE_USER']) === false) { 526a8eebd82SJames Collins $html .= '<div class="mikio-user-info">'; 527a8eebd82SJames Collins ob_start(); 528a8eebd82SJames Collins tpl_userinfo(); 529a8eebd82SJames Collins $html .= ob_get_contents(); 530a8eebd82SJames Collins ob_end_clean(); 531a8eebd82SJames Collins $html .= '</div>'; 5322b4583abSJames Collins } 533a8eebd82SJames Collins 534*9cff245bSJames Collins if ($print === true) { 535*9cff245bSJames Collins echo $html; 536*9cff245bSJames Collins } 537a8eebd82SJames Collins return $html; 5382b4583abSJames Collins } 5392b4583abSJames Collins 5402b4583abSJames Collins 541a8eebd82SJames Collins /** 542a8eebd82SJames Collins * Print or return DokuWiki Menu 543a8eebd82SJames Collins * 544*9cff245bSJames Collins * @param boolean $print Print content. 545a8eebd82SJames Collins * @return string contents of the menu 546a8eebd82SJames Collins */ 547*9cff245bSJames Collins public function includeDWMenu(bool $print = true) 54810b40067Snomadjimbob { 5492b4583abSJames Collins global $lang; 5502b4583abSJames Collins global $USERINFO; 551c165b184SJames Collins 552*9cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 553a8eebd82SJames Collins $html = '<ul class="mikio-nav">'; 5542b4583abSJames Collins 555ab45ba71SJames Collins $pageToolsMenu = []; 556ab45ba71SJames Collins $siteToolsMenu = []; 557ab45ba71SJames Collins $userToolsMenu = []; 558c165b184SJames Collins 559ab45ba71SJames Collins $showIcons = ($this->getConf('navbarDWMenuType') != 'text'); 560ab45ba71SJames Collins $showText = ($this->getConf('navbarDWMenuType') != 'icons'); 561ab45ba71SJames Collins $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate'); 5622b4583abSJames Collins 5632b4583abSJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 5642b4583abSJames Collins foreach ($items as $item) { 565*9cff245bSJames Collins if ($item->getType() !== 'top') { 566ab45ba71SJames Collins $itemHtml = ''; 5672b4583abSJames Collins 568905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 569*9cff245bSJames Collins if ( 570*9cff245bSJames Collins $showItem !== false && ($showItem === 'always' || ($showItem === 'logged in' && 571*9cff245bSJames Collins $loggedIn === true) || ($showItem === 'logged out' && $loggedIn === false)) 572*9cff245bSJames Collins ) { 573*9cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . 574*9cff245bSJames Collins ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 575*9cff245bSJames Collins if ($showIcons === true) { 576*9cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 577*9cff245bSJames Collins } 578*9cff245bSJames Collins if ($showText === true || $isDropDown === true) { 579*9cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 580*9cff245bSJames Collins } 581ab45ba71SJames Collins $itemHtml .= '</a>'; 582ab45ba71SJames Collins 583ab45ba71SJames Collins $pageToolsMenu[] = $itemHtml; 5842b4583abSJames Collins } 585*9cff245bSJames Collins }//end if 586*9cff245bSJames Collins }//end foreach 5872b4583abSJames Collins 588ab45ba71SJames Collins $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action'); 589ab45ba71SJames Collins foreach ($items as $item) { 590ab45ba71SJames Collins $itemHtml = ''; 5912b4583abSJames Collins 592905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 593*9cff245bSJames Collins if ( 594*9cff245bSJames Collins $showItem !== false && ($showItem === 'always' || ($showItem === 'logged in' && $loggedIn === true) || 595*9cff245bSJames Collins ($showItem === 'logged out' && $loggedIn === false)) 596*9cff245bSJames Collins ) { 597*9cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' . 598*9cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 599*9cff245bSJames Collins if ($showIcons === true) { 600*9cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 601*9cff245bSJames Collins } 602*9cff245bSJames Collins if ($showText === true || $isDropDown === true) { 603*9cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 604*9cff245bSJames Collins } 605ab45ba71SJames Collins $itemHtml .= '</a>'; 6062b4583abSJames Collins 607ab45ba71SJames Collins $siteToolsMenu[] = $itemHtml; 6082b4583abSJames Collins } 609*9cff245bSJames Collins }//end foreach 6102b4583abSJames Collins 611ab45ba71SJames Collins $items = (new \dokuwiki\Menu\UserMenu())->getItems('action'); 612ab45ba71SJames Collins foreach ($items as $item) { 613ab45ba71SJames Collins $itemHtml = ''; 614ab45ba71SJames Collins 615905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 616*9cff245bSJames Collins if ( 617*9cff245bSJames Collins $showItem !== false && ($showItem === 'always' || ($showItem === 'logged in' && $loggedIn === true) || 618*9cff245bSJames Collins ($showItem === 'logged out' && $loggedIn === false)) 619*9cff245bSJames Collins ) { 620*9cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' . 621*9cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 622*9cff245bSJames Collins if ($showIcons === true) { 623*9cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 624*9cff245bSJames Collins } 625*9cff245bSJames Collins if ($showText === true || $isDropDown === true) { 626*9cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 627*9cff245bSJames Collins } 628ab45ba71SJames Collins $itemHtml .= '</a>'; 629ab45ba71SJames Collins 630ab45ba71SJames Collins $userToolsMenu[] = $itemHtml; 631ab45ba71SJames Collins } 632*9cff245bSJames Collins }//end foreach 633ab45ba71SJames Collins 634ab45ba71SJames Collins 635ab45ba71SJames Collins switch ($this->getConf('navbarDWMenuCombine')) { 636ab45ba71SJames Collins case 'dropdown': 637ab45ba71SJames Collins $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">'; 638*9cff245bSJames Collins $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button" 639*9cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 640*9cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('file') : '') . 641*9cff245bSJames Collins ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] . 642*9cff245bSJames Collins '</span>') . '</a>'; 643a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 644ab45ba71SJames Collins 645ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 646ab45ba71SJames Collins $html .= $item; 647ab45ba71SJames Collins } 648ab45ba71SJames Collins 649ab45ba71SJames Collins $html .= '</div>'; 650ab45ba71SJames Collins $html .= '</li>'; 651ab45ba71SJames Collins 652a8eebd82SJames Collins $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">'; 653*9cff245bSJames Collins $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button" 654*9cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 655*9cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('gear') : '') . 656*9cff245bSJames Collins ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' . 657*9cff245bSJames Collins $lang['site_tools'] . '</span>') . '</a>'; 658a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 659ab45ba71SJames Collins 660ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 661ab45ba71SJames Collins $html .= $item; 662ab45ba71SJames Collins } 663ab45ba71SJames Collins 664ab45ba71SJames Collins $html .= '</div>'; 665ab45ba71SJames Collins $html .= '</li>'; 666ab45ba71SJames Collins 667a8eebd82SJames Collins $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">'; 668*9cff245bSJames Collins $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button" 669*9cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 670*9cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('user') : '') . 671*9cff245bSJames Collins ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' . 672*9cff245bSJames Collins $lang['user_tools'] . '</span>') . '</a>'; 673a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 674ab45ba71SJames Collins 675ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 676ab45ba71SJames Collins $html .= $item; 677ab45ba71SJames Collins } 678ab45ba71SJames Collins 679ab45ba71SJames Collins $html .= '</div>'; 680ab45ba71SJames Collins $html .= '</li>'; 681ab45ba71SJames Collins 682ab45ba71SJames Collins break; 683ab45ba71SJames Collins 684ab45ba71SJames Collins case 'combine': 685ab45ba71SJames Collins $html .= '<li class="mikio-nav-dropdown">'; 686*9cff245bSJames Collins $html .= '<a class="mikio-nav-link" href="#">' . 687*9cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') . 688*9cff245bSJames Collins ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' . 689*9cff245bSJames Collins tpl_getLang('tools-menu') . '</span>') . '</a>'; 690a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 691ab45ba71SJames Collins 692ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>'; 693ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 694ab45ba71SJames Collins $html .= $item; 695ab45ba71SJames Collins } 696ab45ba71SJames Collins 697ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 698ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>'; 699ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 700ab45ba71SJames Collins $html .= $item; 701ab45ba71SJames Collins } 702ab45ba71SJames Collins 703ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 704ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>'; 705ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 706ab45ba71SJames Collins $html .= $item; 707ab45ba71SJames Collins } 708ab45ba71SJames Collins 709ab45ba71SJames Collins $html .= '</div>'; 710ab45ba71SJames Collins $html .= '</li>'; 711ab45ba71SJames Collins break; 712ab45ba71SJames Collins 713ab45ba71SJames Collins default: // seperate 714ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 715a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 716ab45ba71SJames Collins } 717ab45ba71SJames Collins 718ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 719a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 720a8eebd82SJames Collins } 721a8eebd82SJames Collins 722a8eebd82SJames Collins foreach ($userToolsMenu as $item) { 723a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 724ab45ba71SJames Collins } 725ab45ba71SJames Collins 726ab45ba71SJames Collins break; 727*9cff245bSJames Collins }//end switch 728ab45ba71SJames Collins 729ab45ba71SJames Collins $html .= '</ul>'; 730ab45ba71SJames Collins 731*9cff245bSJames Collins if ($print === true) { 732*9cff245bSJames Collins echo $html; 733*9cff245bSJames Collins } 734a8eebd82SJames Collins return $html; 735a8eebd82SJames Collins } 736a8eebd82SJames Collins 737a8eebd82SJames Collins 738a8eebd82SJames Collins /** 739a8eebd82SJames Collins * Create a nav element from a string. <uri>|<title>; 740a8eebd82SJames Collins * 741*9cff245bSJames Collins * @param string $str String to generate nav. 742a8eebd82SJames Collins * @return string nav elements generated 743a8eebd82SJames Collins */ 744*9cff245bSJames Collins public function stringToNav(string $str) 74510b40067Snomadjimbob { 746a8eebd82SJames Collins $html = ''; 747a8eebd82SJames Collins 748*9cff245bSJames Collins if ($str !== '') { 749a8eebd82SJames Collins $items = explode(';', $str); 750a8eebd82SJames Collins if (count($items) > 0) { 751a8eebd82SJames Collins $html .= '<ul class="mikio-nav">'; 752a8eebd82SJames Collins foreach ($items as $item) { 753a8eebd82SJames Collins $parts = explode('|', $item); 754a8eebd82SJames Collins if ($parts > 1) { 755*9cff245bSJames Collins $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' . 756*9cff245bSJames Collins strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) . 757*9cff245bSJames Collins '</a></li>'; 758a8eebd82SJames Collins } 759a8eebd82SJames Collins } 760a8eebd82SJames Collins $html .= '</ul>'; 761a8eebd82SJames Collins } 7622b4583abSJames Collins } 7632b4583abSJames Collins 764ab45ba71SJames Collins return $html; 7652b4583abSJames Collins } 7662b4583abSJames Collins 767a8eebd82SJames Collins /** 768ab45ba71SJames Collins * print or return the main navbar 7692b4583abSJames Collins * 770*9cff245bSJames Collins * @param boolean $print Print the navbar. 771*9cff245bSJames Collins * @param boolean $showSub Include the sub navbar. 772ab45ba71SJames Collins * @return string generated content 7732b4583abSJames Collins */ 774*9cff245bSJames Collins public function includeNavbar(bool $print = true, bool $showSub = false) 77510b40067Snomadjimbob { 776b39ad16dSJames Collins global $conf, $USERINFO; 777d3d7d2b7SJames Collins 778d3d7d2b7SJames Collins $homeUrl = wl(); 779d3d7d2b7SJames Collins 780*9cff245bSJames Collins if (plugin_isdisabled('showpageafterlogin') === false) { 781d3d7d2b7SJames Collins $p = &plugin_load('action', 'showpageafterlogin'); 782*9cff245bSJames Collins if ($p !== null) { 783*9cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 784d3d7d2b7SJames Collins $homeUrl = wl($p->getConf('page_after_login')); 785d3d7d2b7SJames Collins } 786d3d7d2b7SJames Collins } 787b39ad16dSJames Collins } else { 788*9cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 789b39ad16dSJames Collins $url = $this->getConf('brandURLUser'); 790b39ad16dSJames Collins if (strlen($url) > 0) { 791b39ad16dSJames Collins $homeUrl = $url; 792d3d7d2b7SJames Collins } 793b39ad16dSJames Collins } else { 794b39ad16dSJames Collins $url = $this->getConf('brandURLGuest'); 795b39ad16dSJames Collins if (strlen($url) > 0) { 796b39ad16dSJames Collins $homeUrl = $url; 797b39ad16dSJames Collins } 798b39ad16dSJames Collins } 799b39ad16dSJames Collins } 800d3d7d2b7SJames Collins 801ab45ba71SJames Collins $html = ''; 80247161538SJames Collins 803*9cff245bSJames Collins $html .= '<nav class="mikio-navbar' . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') . 804*9cff245bSJames Collins '">'; 805f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 806d3d7d2b7SJames Collins $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">'; 807*9cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) { 808ab45ba71SJames Collins // Brand image 809*9cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true) { 810*9cff245bSJames Collins $logo = $this->getMediaFile('logo', false); 811*9cff245bSJames Collins ; 812*9cff245bSJames Collins if ($logo !== '') { 813f0241fc4SJames Collins $width = $this->getConf('navbarTitleIconWidth'); 814f0241fc4SJames Collins $height = $this->getConf('navbarTitleIconHeight'); 815f0241fc4SJames Collins $styles = ''; 816f0241fc4SJames Collins 817f0241fc4SJames Collins if (strlen($width) > 0 || strlen($height) > 0) { 818*9cff245bSJames Collins if (ctype_digit($width) === true) { 819f0241fc4SJames Collins $styles .= 'max-width:' . intval($width) . 'px;'; 820*9cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) { 821f0241fc4SJames Collins $styles .= 'max-width:' . $width . ';'; 822*9cff245bSJames Collins } elseif (strcasecmp($width, 'none') === 0) { 8237a92c19bSJames Collins $styles .= 'max-width:none;'; 824f0241fc4SJames Collins } 825f0241fc4SJames Collins 826*9cff245bSJames Collins if (ctype_digit($height) === true) { 827f0241fc4SJames Collins $styles .= 'max-height:' . intval($height) . 'px;'; 828*9cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) { 829f0241fc4SJames Collins $styles .= 'max-height:' . $height . ';'; 830*9cff245bSJames Collins } elseif (strcasecmp($height, 'none') === 0) { 8317a92c19bSJames Collins $styles .= 'max-height:none;'; 832f0241fc4SJames Collins } 833f0241fc4SJames Collins 834f0241fc4SJames Collins if (strlen($styles) > 0) { 835f0241fc4SJames Collins $styles = ' style="' . $styles . '"'; 836f0241fc4SJames Collins } 837*9cff245bSJames Collins }//end if 838f0241fc4SJames Collins 839f0241fc4SJames Collins $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>'; 840*9cff245bSJames Collins }//end if 841*9cff245bSJames Collins }//end if 842ab45ba71SJames Collins 843ab45ba71SJames Collins // Brand title 844*9cff245bSJames Collins if ($this->getConf('navbarUseTitleText') === true) { 845ab45ba71SJames Collins $html .= '<div class="mikio-navbar-brand-title">'; 846a8eebd82SJames Collins $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>'; 847*9cff245bSJames Collins if ($this->getConf('navbarUseTaglineText') === true) { 848a8eebd82SJames Collins $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>'; 849ab45ba71SJames Collins } 850ab45ba71SJames Collins $html .= '</div>'; 851ab45ba71SJames Collins } 852*9cff245bSJames Collins }//end if 853ab45ba71SJames Collins $html .= '</a>'; 854660b2c71SJames Collins $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>'; 855ab45ba71SJames Collins 856ab45ba71SJames Collins // Menus 857ab45ba71SJames Collins $html .= '<div class="mikio-navbar-collapse">'; 858ab45ba71SJames Collins 859*9cff245bSJames Collins $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'), 860*9cff245bSJames Collins $this->getConf('navbarPosRight', 'none') 861*9cff245bSJames Collins ]; 862a8eebd82SJames Collins foreach ($menus as $menuType) { 863a8eebd82SJames Collins switch ($menuType) { 864a8eebd82SJames Collins case 'custom': 865a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', '')); 866a8eebd82SJames Collins break; 867a8eebd82SJames Collins case 'search': 868ab45ba71SJames Collins $html .= '<div class="mikio-nav-item">'; 869ab45ba71SJames Collins $html .= $this->includeSearch(false); 870ab45ba71SJames Collins $html .= '</div>'; 871a8eebd82SJames Collins break; 872a8eebd82SJames Collins case 'dokuwiki': 873*9cff245bSJames Collins $html .= $this->includeDWMenu(false); 874a8eebd82SJames Collins break; 875a8eebd82SJames Collins } 876a8eebd82SJames Collins } 877ab45ba71SJames Collins 878ab45ba71SJames Collins $html .= '</div>'; 879f8039bf2SJames Collins $html .= '</div>'; 880ab45ba71SJames Collins $html .= '</nav>'; 881ab45ba71SJames Collins 882a8eebd82SJames Collins // Sub Navbar 883*9cff245bSJames Collins if ($showSub === true) { 884*9cff245bSJames Collins $sub = $this->includePage('submenu', false); 885*9cff245bSJames Collins if ($sub !== '') { 886*9cff245bSJames Collins $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>'; 887*9cff245bSJames Collins } 888ab45ba71SJames Collins } 889ab45ba71SJames Collins 890*9cff245bSJames Collins if ($print === true) { 891*9cff245bSJames Collins echo $html; 892*9cff245bSJames Collins } 893ab45ba71SJames Collins return $html; 894ab45ba71SJames Collins } 895ab45ba71SJames Collins 896ab45ba71SJames Collins 897a8eebd82SJames Collins /** 898a8eebd82SJames Collins * Is there a sidebar 899a8eebd82SJames Collins * 900*9cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 901a8eebd82SJames Collins * @return boolean if sidebar exists 902a8eebd82SJames Collins */ 903*9cff245bSJames Collins public function sidebarExists(string $prefix = '') 90410b40067Snomadjimbob { 905a8eebd82SJames Collins global $conf; 906a8eebd82SJames Collins 907*9cff245bSJames Collins if ($prefix === 'left') { 908*9cff245bSJames Collins $prefix = ''; 909*9cff245bSJames Collins } 910a8eebd82SJames Collins 911a8eebd82SJames Collins return $this->pageExists($conf['sidebar' . $prefix]); 912a8eebd82SJames Collins } 913a8eebd82SJames Collins 914a8eebd82SJames Collins 915a8eebd82SJames Collins /** 916ab45ba71SJames Collins * Print or return the sidebar content 917ab45ba71SJames Collins * 918*9cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 919*9cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 920*9cff245bSJames Collins * @param boolean $parse Parse the content. 921ab45ba71SJames Collins * @return string generated content 922ab45ba71SJames Collins */ 923*9cff245bSJames Collins public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true) 92410b40067Snomadjimbob { 925ab45ba71SJames Collins global $conf, $ID; 926ab45ba71SJames Collins 927ab45ba71SJames Collins $html = ''; 928ab45ba71SJames Collins $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix)); 929ab45ba71SJames Collins $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix)); 930ab45ba71SJames Collins 931*9cff245bSJames Collins if ($confPrefix === '') { 932*9cff245bSJames Collins $confPrefix = 'Left'; 933*9cff245bSJames Collins } 934*9cff245bSJames Collins if ($prefix === 'Left') { 935*9cff245bSJames Collins $prefix = ''; 936*9cff245bSJames Collins } 937ab45ba71SJames Collins 938*9cff245bSJames Collins $sidebarPage = $conf[$prefix . 'sidebar'] === '' ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar']; 939ab45ba71SJames Collins 940*9cff245bSJames Collins if ( 941*9cff245bSJames Collins $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false && 942*9cff245bSJames Collins p_get_metadata($ID, 'nosidebar', false) === false 943*9cff245bSJames Collins ) { 944*9cff245bSJames Collins $content = $this->includePage($sidebarPage . 'header', false); 945*9cff245bSJames Collins if ($content !== '') { 946*9cff245bSJames Collins $html .= '<div class="mikio-sidebar-header">' . $content . '</div>'; 947*9cff245bSJames Collins } 948ab45ba71SJames Collins 949*9cff245bSJames Collins if ($prefix === '') { 950*9cff245bSJames Collins $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'), 951*9cff245bSJames Collins $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4') 952*9cff245bSJames Collins ]; 953ab45ba71SJames Collins 954a8eebd82SJames Collins foreach ($rows as $row) { 955a8eebd82SJames Collins switch ($row) { 956a8eebd82SJames Collins case 'search': 957*9cff245bSJames Collins $html .= $this->includeSearch(false); 958a8eebd82SJames Collins break; 959a8eebd82SJames Collins case 'logged in user': 960*9cff245bSJames Collins $html .= $this->includeLoggedIn(false); 961a8eebd82SJames Collins break; 962a8eebd82SJames Collins case 'content': 963*9cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 964*9cff245bSJames Collins if ($content !== '') { 965*9cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 966*9cff245bSJames Collins } 967a8eebd82SJames Collins break; 968a8eebd82SJames Collins case 'tags': 969a8eebd82SJames Collins $html .= '<div class="mikio-tags"></div>'; 970a8eebd82SJames Collins } 971a8eebd82SJames Collins } 972a8eebd82SJames Collins } else { 973*9cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 974*9cff245bSJames Collins if ($content !== '') { 975*9cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 976*9cff245bSJames Collins } 977*9cff245bSJames Collins }//end if 978*9cff245bSJames Collins 979*9cff245bSJames Collins $content = $this->includePage($sidebarPage . 'footer', false); 980*9cff245bSJames Collins if ($content !== '') { 981*9cff245bSJames Collins $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>'; 982*9cff245bSJames Collins } 983*9cff245bSJames Collins }//end if 984*9cff245bSJames Collins 985*9cff245bSJames Collins if ($html === '') { 986*9cff245bSJames Collins if ($prefix === '' && $this->getConf('sidebarAlwaysShowLeft') === true) { 987*9cff245bSJames Collins $html = ' '; 988*9cff245bSJames Collins } 989*9cff245bSJames Collins if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) { 990*9cff245bSJames Collins $html = ' '; 991*9cff245bSJames Collins } 992a8eebd82SJames Collins } 993ab45ba71SJames Collins 994*9cff245bSJames Collins if ($html !== '') { 995*9cff245bSJames Collins $html = '<aside class="mikio-sidebar mikio-sidebar-' . ($prefix === '' ? 'left' : $prefix) . 996*9cff245bSJames Collins '"><a class="mikio-sidebar-toggle' . 997*9cff245bSJames Collins ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' . 998*9cff245bSJames Collins tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' . 999*9cff245bSJames Collins $html . '</div></aside>'; 1000ab45ba71SJames Collins } 1001ab45ba71SJames Collins 1002*9cff245bSJames Collins if ($parse === true) { 1003*9cff245bSJames Collins $html = $this->includeIcons($html); 10043a04a100SJames Collins } 1005*9cff245bSJames Collins if ($print === true) { 1006*9cff245bSJames Collins echo $html; 1007ab45ba71SJames Collins } 1008ab45ba71SJames Collins return $html; 1009ab45ba71SJames Collins } 1010ab45ba71SJames Collins 1011ab45ba71SJames Collins 1012a8eebd82SJames Collins /** 1013ab45ba71SJames Collins * Print or return the page tools content 1014ab45ba71SJames Collins * 1015*9cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 1016*9cff245bSJames Collins * @param boolean $includeId Include the dw__pagetools id in the element. 1017ab45ba71SJames Collins * @return string generated content 1018ab45ba71SJames Collins */ 1019*9cff245bSJames Collins public function includePageTools(bool $print = true, bool $includeId = false) 102010b40067Snomadjimbob { 10211293ce10SJames Collins global $USERINFO; 10221293ce10SJames Collins 1023*9cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 1024ab45ba71SJames Collins $html = ''; 1025ab45ba71SJames Collins 1026*9cff245bSJames Collins $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">'; 1027b9c0582bSJames Collins $html .= '<ul class="tools">'; 1028ab45ba71SJames Collins 1029ab45ba71SJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 1030ab45ba71SJames Collins foreach ($items as $item) { 1031*9cff245bSJames Collins $classes = []; 10323fd763a0SJames Collins $classes[] = $item->getType(); 10333fd763a0SJames Collins $attr = $item->getLinkAttributes(); 10343fd763a0SJames Collins 1035*9cff245bSJames Collins if (empty($attr['class']) === false) { 10363fd763a0SJames Collins $classes = array_merge($classes, explode(' ', $attr['class'])); 1037ab45ba71SJames Collins } 1038ab45ba71SJames Collins 10393fd763a0SJames Collins $classes = array_unique($classes); 10403fd763a0SJames Collins 10411293ce10SJames Collins $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType())); 1042*9cff245bSJames Collins if ( 1043*9cff245bSJames Collins $showItem !== false && ($showItem === 'always' || ($showItem === 'logged in' && $loggedIn === true) || 1044*9cff245bSJames Collins ($showItem === 'logged out' && $loggedIn === true)) 1045*9cff245bSJames Collins ) { 10463fd763a0SJames Collins $html .= '<li class="' . implode(' ', $classes) . '">'; 1047*9cff245bSJames Collins $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' . 1048*9cff245bSJames Collins $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) . 1049*9cff245bSJames Collins '</div><span class="a11y">' . $item->getLabel() . '</span></a>'; 10503fd763a0SJames Collins $html .= '</li>'; 10513fd763a0SJames Collins } 1052*9cff245bSJames Collins }//end foreach 10533fd763a0SJames Collins 10543fd763a0SJames Collins $html .= '</ul>'; 1055ab45ba71SJames Collins $html .= '</nav>'; 1056ab45ba71SJames Collins 1057*9cff245bSJames Collins if ($print === true) { 1058*9cff245bSJames Collins echo $html; 1059*9cff245bSJames Collins } 1060ab45ba71SJames Collins return $html; 1061ab45ba71SJames Collins } 1062ab45ba71SJames Collins 1063ab45ba71SJames Collins 1064a8eebd82SJames Collins /** 1065a8eebd82SJames Collins * Print or return the search bar 1066a8eebd82SJames Collins * 1067*9cff245bSJames Collins * @param boolean $print Print content. 1068a8eebd82SJames Collins * @return string contents of the search bar 1069a8eebd82SJames Collins */ 1070*9cff245bSJames Collins public function includeSearch(bool $print = true) 107110b40067Snomadjimbob { 1072*9cff245bSJames Collins global $lang, $ID, $ACT, $QUERY; 1073ab45ba71SJames Collins $html = ''; 1074ab45ba71SJames Collins 1075*9cff245bSJames Collins $html .= '<form class="mikio-search search" action="' . wl() . 1076*9cff245bSJames Collins '" accept-charset="utf-8" method="get" role="search">'; 1077a8eebd82SJames Collins $html .= '<input type="hidden" name="do" value="search">'; 1078a8eebd82SJames Collins $html .= '<input type="hidden" name="id" value="' . $ID . '">'; 1079c1cb9f15SChris MacMackin $html .= '<input name="q" '; 1080*9cff245bSJames Collins if ($this->getConf('searchUseTypeahead') === true) { 1081c1cb9f15SChris MacMackin $html .= 'class="search_typeahead" '; 1082c1cb9f15SChris MacMackin } 1083*9cff245bSJames Collins $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' . 1084*9cff245bSJames Collins (($ACT === 'search') ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />'; 1085a8eebd82SJames Collins $html .= '<button type="submit" title="' . $lang['btn_search'] . '">'; 1086*9cff245bSJames Collins if ($this->getConf('searchButton') === 'icon') { 1087a8eebd82SJames Collins $html .= $this->mikioInlineIcon('search'); 1088ab45ba71SJames Collins } else { 1089ab45ba71SJames Collins $html .= $lang['btn_search']; 1090ab45ba71SJames Collins } 1091ab45ba71SJames Collins $html .= '</button>'; 1092ab45ba71SJames Collins $html .= '</form>'; 1093ab45ba71SJames Collins 1094*9cff245bSJames Collins if ($print === true) { 1095*9cff245bSJames Collins echo $html; 1096*9cff245bSJames Collins } 1097ab45ba71SJames Collins return $html; 1098ab45ba71SJames Collins } 1099ab45ba71SJames Collins 1100ab45ba71SJames Collins 1101a8eebd82SJames Collins /** 1102a8eebd82SJames Collins * Print or return content 1103a8eebd82SJames Collins * 1104*9cff245bSJames Collins * @param boolean $print Print content. 1105a8eebd82SJames Collins * @return string contents 1106a8eebd82SJames Collins */ 1107*9cff245bSJames Collins public function includeContent(bool $print = true) 110810b40067Snomadjimbob { 1109ab45ba71SJames Collins ob_start(); 1110*9cff245bSJames Collins tpl_content(false); 1111ab45ba71SJames Collins $html = ob_get_contents(); 1112ab45ba71SJames Collins ob_end_clean(); 1113ab45ba71SJames Collins 1114ab45ba71SJames Collins $html = $this->includeIcons($html); 1115ab45ba71SJames Collins $html = $this->parseContent($html); 1116ab45ba71SJames Collins 1117ab45ba71SJames Collins $html .= '<div style="clear:both"></div>'; 1118ab45ba71SJames Collins 1119*9cff245bSJames Collins if ($this->getConf('heroTitle') === false) { 1120*9cff245bSJames Collins $html = '<div class="mikio-tags"></div>' . $html; 1121*9cff245bSJames Collins } 1122a8eebd82SJames Collins 1123a8eebd82SJames Collins $html = '<div class="mikio-article-content">' . $html . '</div>'; 1124a8eebd82SJames Collins 1125*9cff245bSJames Collins if ($print === true) { 1126*9cff245bSJames Collins echo $html; 1127*9cff245bSJames Collins } 1128ab45ba71SJames Collins return $html; 1129ab45ba71SJames Collins } 1130ab45ba71SJames Collins 1131a8eebd82SJames Collins /** 1132ab45ba71SJames Collins * Print or return footer 1133ab45ba71SJames Collins * 1134*9cff245bSJames Collins * @param boolean $print Print footer. 1135*9cff245bSJames Collins * @return string HTML string containing footer 1136ab45ba71SJames Collins */ 1137*9cff245bSJames Collins public function includeFooter(bool $print = true) 113810b40067Snomadjimbob { 1139ab45ba71SJames Collins global $ACT; 1140ab45ba71SJames Collins 1141ab45ba71SJames Collins $html = ''; 1142ab45ba71SJames Collins 1143ab45ba71SJames Collins $html .= '<footer class="mikio-footer">'; 1144*9cff245bSJames Collins $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>'; 1145*9cff245bSJames Collins $html .= $this->includePage('footer', false); 1146ab45ba71SJames Collins 1147a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('footerCustomMenuText')); 1148ab45ba71SJames Collins 1149*9cff245bSJames Collins if ($this->getConf('footerSearch') === true) { 1150ab45ba71SJames Collins $html .= '<div class="mikio-footer-search">'; 1151*9cff245bSJames Collins $html .= $this->includeSearch(false); 1152ab45ba71SJames Collins $html .= '</div>'; 1153ab45ba71SJames Collins } 1154ab45ba71SJames Collins 1155a8eebd82SJames Collins $showPageTools = $this->getConf('pageToolsFooter'); 1156*9cff245bSJames Collins if ( 1157*9cff245bSJames Collins $ACT === 'show' && ($showPageTools === 'always' || $this->userCanEdit() === true && 1158*9cff245bSJames Collins $showPageTools === 'page editors') 1159*9cff245bSJames Collins ) { 1160*9cff245bSJames Collins $html .= $this->includePageTools(false); 1161*9cff245bSJames Collins } 1162ab45ba71SJames Collins 1163*9cff245bSJames Collins $meta['licenseType'] = ['multichoice', '_choices' => ['none', 'badge', 'button']]; 1164*9cff245bSJames Collins $meta['licenseImageOnly'] = ['onoff']; 1165ab45ba71SJames Collins 1166ab45ba71SJames Collins $licenseType = $this->getConf('licenseType'); 1167*9cff245bSJames Collins if ($licenseType !== 'none') { 1168*9cff245bSJames Collins $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true); 1169ab45ba71SJames Collins } 1170ab45ba71SJames Collins 1171ab45ba71SJames Collins $html .= '</footer>'; 1172ab45ba71SJames Collins 1173*9cff245bSJames Collins if ($print === true) { 1174*9cff245bSJames Collins echo $html; 1175*9cff245bSJames Collins } 1176ab45ba71SJames Collins return $html; 1177ab45ba71SJames Collins } 1178ab45ba71SJames Collins 1179ab45ba71SJames Collins 1180a8eebd82SJames Collins /** 1181ab45ba71SJames Collins * Print or return breadcrumb trail 1182ab45ba71SJames Collins * 1183*9cff245bSJames Collins * @param boolean $print Print out trail. 1184*9cff245bSJames Collins * @param boolean $parse Parse trail before printing. 1185*9cff245bSJames Collins * @return string HTML string containing breadcrumbs 1186ab45ba71SJames Collins */ 1187*9cff245bSJames Collins public function includeBreadcrumbs(bool $print = true, bool $parse = true) 118810b40067Snomadjimbob { 1189a8eebd82SJames Collins global $conf, $ID, $lang, $ACT; 1190a8eebd82SJames Collins 1191*9cff245bSJames Collins if ($this->getConf('breadcrumbHideHome') === true && $ID === 'start' && $ACT === 'show' || $ACT === 'showtag') { 1192*9cff245bSJames Collins return ''; 1193*9cff245bSJames Collins } 1194ab45ba71SJames Collins 1195ab45ba71SJames Collins $html = '<div class="mikio-breadcrumbs">'; 1196f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 1197*9cff245bSJames Collins if ($ACT === 'show') { 1198*9cff245bSJames Collins if ($conf['breadcrumbs'] === true) { 1199*9cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) { 1200ab45ba71SJames Collins ob_start(); 120175adba86SJames Collins tpl_breadcrumbs(); 1202ab45ba71SJames Collins $html .= ob_get_contents(); 1203ab45ba71SJames Collins ob_end_clean(); 1204ab45ba71SJames Collins } else { 1205ab45ba71SJames Collins $sep = '•'; 1206ab45ba71SJames Collins $prefix = $lang['breadcrumb']; 1207ab45ba71SJames Collins 1208*9cff245bSJames Collins if ($this->getConf('breadcrumbSep') === true) { 1209ab45ba71SJames Collins $sep = $this->getConf('breadcrumbSepText'); 1210*9cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-sep', false); 1211ab45ba71SJames Collins 1212*9cff245bSJames Collins if ($img !== false) { 1213ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1214ab45ba71SJames Collins } 121547161538SJames Collins } 121647161538SJames Collins 1217*9cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === true) { 1218ab45ba71SJames Collins $prefix = $this->getConf('breadcrumbPrefixText'); 1219*9cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-prefix', false); 1220ab45ba71SJames Collins 1221*9cff245bSJames Collins if ($img !== false) { 1222ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 1223ab45ba71SJames Collins } 1224ab45ba71SJames Collins } 1225ab45ba71SJames Collins 1226ab45ba71SJames Collins $crumbs = breadcrumbs(); 1227ab45ba71SJames Collins 1228ab45ba71SJames Collins $html .= '<ul>'; 1229*9cff245bSJames Collins if ($prefix !== '') { 1230*9cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 1231*9cff245bSJames Collins } 1232ab45ba71SJames Collins 1233ab45ba71SJames Collins $last = count($crumbs); 1234ab45ba71SJames Collins $i = 0; 1235ab45ba71SJames Collins foreach ($crumbs as $id => $name) { 1236ab45ba71SJames Collins $i++; 1237ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 1238*9cff245bSJames Collins $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>'; 1239*9cff245bSJames Collins $html .= tpl_pagelink($id, null, true); 1240ab45ba71SJames Collins $html .= '</li>'; 1241ab45ba71SJames Collins } 1242ab45ba71SJames Collins 1243ab45ba71SJames Collins $html .= '</ul>'; 1244*9cff245bSJames Collins }//end if 1245*9cff245bSJames Collins }//end if 1246*9cff245bSJames Collins }//end if 12473d11a778SJames Collins 12483d11a778SJames Collins $html .= '</div>'; 12493d11a778SJames Collins $html .= '</div>'; 12503d11a778SJames Collins 1251*9cff245bSJames Collins if ($parse === true) { 1252*9cff245bSJames Collins $html = $this->includeIcons($html); 1253*9cff245bSJames Collins } 1254*9cff245bSJames Collins if ($print === true) { 1255*9cff245bSJames Collins echo $html; 1256*9cff245bSJames Collins } 12573d11a778SJames Collins return $html; 12583d11a778SJames Collins } 12593d11a778SJames Collins 12603d11a778SJames Collins /** 12613d11a778SJames Collins * Print or return you are here trail 12623d11a778SJames Collins * 1263*9cff245bSJames Collins * @param boolean $print Print out trail. 1264*9cff245bSJames Collins * @param boolean $parse Parse trail before printing. 1265*9cff245bSJames Collins * @return string HTML string containing breadcrumbs 12663d11a778SJames Collins */ 1267*9cff245bSJames Collins public function includeYouAreHere(bool $print = true, bool $parse = true) 12683d11a778SJames Collins { 12693d11a778SJames Collins global $conf, $ID, $lang, $ACT; 12703d11a778SJames Collins 1271*9cff245bSJames Collins if ($this->getConf('youarehereHideHome') === true && $ID === 'start' && $ACT === 'show' || $ACT === 'showtag') { 1272*9cff245bSJames Collins return ''; 1273*9cff245bSJames Collins } 12743d11a778SJames Collins 12753d11a778SJames Collins $html = '<div class="mikio-youarehere">'; 12763d11a778SJames Collins $html .= '<div class="mikio-container">'; 1277*9cff245bSJames Collins if ($ACT === 'show') { 1278*9cff245bSJames Collins if ($conf['youarehere'] === true) { 1279*9cff245bSJames Collins if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) { 1280ab45ba71SJames Collins ob_start(); 128175adba86SJames Collins tpl_youarehere(); 1282ab45ba71SJames Collins $html .= ob_get_contents(); 1283ab45ba71SJames Collins ob_end_clean(); 1284ab45ba71SJames Collins } else { 1285ab45ba71SJames Collins $sep = ' » '; 1286ab45ba71SJames Collins $prefix = $lang['youarehere']; 1287ab45ba71SJames Collins 1288*9cff245bSJames Collins if ($this->getConf('youarehereSep') === true) { 12893d11a778SJames Collins $sep = $this->getConf('youarehereSepText'); 1290*9cff245bSJames Collins $img = $this->getMediaFile('youarehere-sep', false); 1291ab45ba71SJames Collins 1292*9cff245bSJames Collins if ($img !== false) { 1293ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1294ab45ba71SJames Collins } 129575adba86SJames Collins } 129675adba86SJames Collins 1297*9cff245bSJames Collins if ($this->getConf('youareherePrefix') === true) { 12983d11a778SJames Collins $prefix = $this->getConf('youareherePrefixText'); 1299*9cff245bSJames Collins $img = $this->getMediaFile('youarehere-prefix', false); 1300ab45ba71SJames Collins 1301*9cff245bSJames Collins if ($img !== false) { 1302ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 130375adba86SJames Collins } 130447161538SJames Collins } 130547161538SJames Collins 1306ab45ba71SJames Collins $html .= '<ul>'; 1307*9cff245bSJames Collins if ($prefix !== '') { 1308*9cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 1309*9cff245bSJames Collins } 1310*9cff245bSJames Collins $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>'; 1311ab45ba71SJames Collins 1312ab45ba71SJames Collins $parts = explode(':', $ID); 1313ab45ba71SJames Collins $count = count($parts); 1314ab45ba71SJames Collins 1315ab45ba71SJames Collins $part = ''; 1316*9cff245bSJames Collins for ($i = 0; $i < ($count - 1); $i++) { 1317ab45ba71SJames Collins $part .= $parts[$i] . ':'; 1318ab45ba71SJames Collins $page = $part; 1319*9cff245bSJames Collins if ($page === $conf['start']) { 1320*9cff245bSJames Collins continue; 1321*9cff245bSJames Collins } 1322ab45ba71SJames Collins 1323ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 1324*9cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1325ab45ba71SJames Collins } 1326ab45ba71SJames Collins 1327ab45ba71SJames Collins resolve_pageid('', $page, $exists); 1328*9cff245bSJames Collins if ((isset($page) === true && $page === $part . $parts[$i]) === false) { 1329ab45ba71SJames Collins $page = $part . $parts[$i]; 1330*9cff245bSJames Collins if ($page !== $conf['start']) { 1331ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 1332*9cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1333ab45ba71SJames Collins } 1334ab45ba71SJames Collins } 1335ab45ba71SJames Collins 1336ab45ba71SJames Collins $html .= '</ul>'; 1337*9cff245bSJames Collins }//end if 1338*9cff245bSJames Collins }//end if 1339ab45ba71SJames Collins 13403d11a778SJames Collins $showLast = $this->getConf('youarehereShowLast'); 1341*9cff245bSJames Collins if ($showLast !== 0) { 1342a8eebd82SJames Collins preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches); 1343*9cff245bSJames Collins if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) { 1344a8eebd82SJames Collins $count = count($matches[0]); 1345a8eebd82SJames Collins $list = ''; 1346a8eebd82SJames Collins 1347a8eebd82SJames Collins // Show Home 1348a8eebd82SJames Collins $list .= $matches[0][0] . $matches[0][1]; 1349a8eebd82SJames Collins 1350a8eebd82SJames Collins $list .= '<li>...</li>'; 1351*9cff245bSJames Collins for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) { 1352a8eebd82SJames Collins $list .= $matches[0][$i]; 1353a8eebd82SJames Collins } 1354a8eebd82SJames Collins 1355a8eebd82SJames Collins $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html); 1356a8eebd82SJames Collins } 1357a8eebd82SJames Collins } 1358a8eebd82SJames Collins 13593d11a778SJames Collins switch ($this->getConf('youarehereHome')) { 1360a8eebd82SJames Collins case 'none': 1361a8eebd82SJames Collins $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2); 1362a8eebd82SJames Collins break; 1363a8eebd82SJames Collins case 'home': 1364a8eebd82SJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1); 1365a8eebd82SJames Collins break; 1366a8eebd82SJames Collins case 'icon': 1367*9cff245bSJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . 1368*9cff245bSJames Collins $this->mikioInlineIcon('home') . '$3', $html, 1); 1369a8eebd82SJames Collins break; 1370a8eebd82SJames Collins } 1371a8eebd82SJames Collins } else { 1372a8eebd82SJames Collins $html .= '≪ '; 1373*9cff245bSJames Collins if (isset($_GET['page']) === true) { 1374*9cff245bSJames Collins $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a> / '; 1375a8eebd82SJames Collins } 13764057121fSJames Collins $html .= '<a href="' . wl($ID) . '">View Page</a>'; 1377*9cff245bSJames Collins }//end if 1378*9cff245bSJames Collins 1379*9cff245bSJames Collins $html .= '</div>'; 1380*9cff245bSJames Collins $html .= '</div>'; 1381*9cff245bSJames Collins 1382*9cff245bSJames Collins if ($parse === true) { 1383*9cff245bSJames Collins $html = $this->includeIcons($html); 1384a8eebd82SJames Collins } 1385*9cff245bSJames Collins if ($print === true) { 1386*9cff245bSJames Collins echo $html; 1387*9cff245bSJames Collins } 1388ab45ba71SJames Collins return $html; 1389ab45ba71SJames Collins } 1390ab45ba71SJames Collins 13911785fc73SJames Collins /** 13921785fc73SJames Collins * Get Page Title 1393*9cff245bSJames Collins * 1394*9cff245bSJames Collins * @return string page title 13951785fc73SJames Collins */ 139610b40067Snomadjimbob public function parsePageTitle() 139710b40067Snomadjimbob { 13982060e56cSJames Collins global $ID; 13992060e56cSJames Collins 14002060e56cSJames Collins $title = p_get_first_heading($ID); 1401*9cff245bSJames Collins if (strlen($title) <= 0) { 1402*9cff245bSJames Collins $title = tpl_pagetitle(null, true); 1403*9cff245bSJames Collins } 14041785fc73SJames Collins $title = $this->includeIcons($title); 14051785fc73SJames Collins 14061785fc73SJames Collins return $title; 14071785fc73SJames Collins } 14081785fc73SJames Collins 1409ab45ba71SJames Collins 141075adba86SJames Collins /** 1411a8eebd82SJames Collins * Print or return hero block 141275adba86SJames Collins * 1413*9cff245bSJames Collins * @param boolean $print Print content. 1414a8eebd82SJames Collins * @return string contents of hero 141575adba86SJames Collins */ 1416*9cff245bSJames Collins public function includeHero(bool $print = true) 141710b40067Snomadjimbob { 1418a8eebd82SJames Collins $html = ''; 141947161538SJames Collins 1420*9cff245bSJames Collins if ($this->getConf('heroTitle') === true) { 1421a8eebd82SJames Collins $html .= '<div class="mikio-hero">'; 1422f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 1423a8eebd82SJames Collins $html .= '<div class="mikio-hero-text">'; 1424*9cff245bSJames Collins if ($this->getConf('youareherePosition') === 'hero') { 1425*9cff245bSJames Collins $html .= $this->includeYouAreHere(false); 1426*9cff245bSJames Collins } 1427*9cff245bSJames Collins if ($this->getConf('breadcrumbPosition') === 'hero') { 1428*9cff245bSJames Collins $html .= $this->includeBreadcrumbs(false); 1429*9cff245bSJames Collins } 1430ab45ba71SJames Collins 1431a8eebd82SJames Collins $html .= '<h1 class="mikio-hero-title">'; 14321785fc73SJames Collins $html .= $this->parsePageTitle(); // No idea why this requires a blank space afterwards to work? 1433a8eebd82SJames Collins $html .= '</h1>'; 1434a8eebd82SJames Collins $html .= '<h2 class="mikio-hero-subtitle"></h2>'; 1435a8eebd82SJames Collins $html .= '</div>'; 143647161538SJames Collins 1437*9cff245bSJames Collins $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true)); 1438a8eebd82SJames Collins $hero_image_resize_class = ''; 1439*9cff245bSJames Collins if ($hero_image !== '') { 1440a8eebd82SJames Collins $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"'; 1441a8eebd82SJames Collins $hero_image_resize_class = ' mikio-hero-image-resize'; 144247161538SJames Collins } 1443a8eebd82SJames Collins 1444*9cff245bSJames Collins $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image . 1445*9cff245bSJames Collins '><div class="mikio-tags"></div></div>'; 1446a8eebd82SJames Collins 1447a8eebd82SJames Collins $html .= '</div>'; 1448f8039bf2SJames Collins $html .= '</div>'; 1449*9cff245bSJames Collins }//end if 1450*9cff245bSJames Collins 1451*9cff245bSJames Collins if ($print === true) { 1452*9cff245bSJames Collins echo $html; 145375adba86SJames Collins } 1454a8eebd82SJames Collins 1455a8eebd82SJames Collins return $html; 145675adba86SJames Collins } 145775adba86SJames Collins 145875adba86SJames Collins 145975adba86SJames Collins /** 1460a8eebd82SJames Collins * Print or return out TOC 146175adba86SJames Collins * 1462*9cff245bSJames Collins * @param boolean $print Print TOC. 1463*9cff245bSJames Collins * @param boolean $parse Parse icons. 1464a8eebd82SJames Collins * @return string contents of TOC 146575adba86SJames Collins */ 1466*9cff245bSJames Collins public function includeTOC(bool $print = true, bool $parse = true) 146710b40067Snomadjimbob { 1468ab45ba71SJames Collins $html = ''; 14692b4583abSJames Collins 1470ab45ba71SJames Collins $tocHtml = tpl_toc(true); 1471ab45ba71SJames Collins 1472*9cff245bSJames Collins if ($tocHtml !== '') { 1473ab45ba71SJames Collins $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml); 1474a8eebd82SJames Collins $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml); 1475ab45ba71SJames Collins 1476ab45ba71SJames Collins $html .= '<div class="mikio-toc">'; 1477ab45ba71SJames Collins $html .= $tocHtml; 1478ab45ba71SJames Collins $html .= '</div>'; 14792b4583abSJames Collins } 14802b4583abSJames Collins 1481*9cff245bSJames Collins if ($parse === true) { 1482*9cff245bSJames Collins $html = $this->includeIcons($html); 1483*9cff245bSJames Collins } 1484*9cff245bSJames Collins 1485*9cff245bSJames Collins if ($print === true) { 1486ab45ba71SJames Collins echo $html; 1487ab45ba71SJames Collins } 1488ab45ba71SJames Collins 1489*9cff245bSJames Collins return $html; 1490*9cff245bSJames Collins } 1491*9cff245bSJames Collins 1492ab45ba71SJames Collins 1493a8eebd82SJames Collins /** 1494ab45ba71SJames Collins * Parse the string and replace icon elements with included icon libraries 1495ab45ba71SJames Collins * 1496*9cff245bSJames Collins * @param string $str Content to parse. 1497ab45ba71SJames Collins * @return string parsed string 1498ab45ba71SJames Collins */ 1499*9cff245bSJames Collins public function includeIcons(string $str) 150010b40067Snomadjimbob { 1501ab45ba71SJames Collins global $ACT, $MIKIO_ICONS; 1502ab45ba71SJames Collins 1503ab45ba71SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 1504*9cff245bSJames Collins if ($iconTag === '') { 1505*9cff245bSJames Collins return $str; 1506*9cff245bSJames Collins } 1507ab45ba71SJames Collins 1508*9cff245bSJames Collins if ( 1509*9cff245bSJames Collins in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true || 1510*9cff245bSJames Collins $ACT === 'admin' && count($MIKIO_ICONS) > 0 1511*9cff245bSJames Collins ) { 1512a2005a27SJames Collins $content = $str; 1513a2005a27SJames Collins $preview = null; 1514a2005a27SJames Collins 1515*9cff245bSJames Collins if ($ACT === 'preview') { 1516*9cff245bSJames Collins $html = new \simple_html_dom(); 1517a2005a27SJames Collins $html->stripRNAttrValues = false; 1518a2005a27SJames Collins $html->load($str, true, false); 1519a2005a27SJames Collins 1520a2005a27SJames Collins $preview = $html->find('div.preview'); 1521*9cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1522a2005a27SJames Collins $content = $preview[0]->innertext; 1523a2005a27SJames Collins } 1524a2005a27SJames Collins } 1525a2005a27SJames Collins 15261785fc73SJames Collins $page_regex = '/(.*)/'; 1527*9cff245bSJames Collins if (stripos($str, '<pre') !== false) { 15281785fc73SJames Collins $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/'; 15291785fc73SJames Collins } 15301785fc73SJames Collins 15311785fc73SJames Collins $content = preg_replace_callback($page_regex, function ($icons) { 1532a2005a27SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 1533a2005a27SJames Collins 153410b40067Snomadjimbob return preg_replace_callback( 153510b40067Snomadjimbob '/<' . $iconTag . ' ([\w\- #]*)>(?=[^>]*(<|$))/', 1536ab45ba71SJames Collins function ($matches) { 1537ab45ba71SJames Collins global $MIKIO_ICONS; 1538ab45ba71SJames Collins 1539ab45ba71SJames Collins $s = $matches[0]; 1540ab45ba71SJames Collins 1541ab45ba71SJames Collins if (count($MIKIO_ICONS) > 0) { 1542ab45ba71SJames Collins $icon = $MIKIO_ICONS[0]; 1543ab45ba71SJames Collins 1544ab45ba71SJames Collins if (count($matches) > 1) { 1545ab45ba71SJames Collins $e = explode(' ', $matches[1]); 1546ab45ba71SJames Collins 1547ab45ba71SJames Collins if (count($e) > 1) { 1548ab45ba71SJames Collins foreach ($MIKIO_ICONS as $iconItem) { 1549*9cff245bSJames Collins if (strcasecmp($iconItem['name'], $e[0]) === 0) { 1550ab45ba71SJames Collins $icon = $iconItem; 1551ab45ba71SJames Collins 1552ab45ba71SJames Collins $s = $icon['insert']; 1553ab45ba71SJames Collins for ($i = 1; $i < 9; $i++) { 1554*9cff245bSJames Collins if (count($e) < $i || $e[$i] === '') { 1555*9cff245bSJames Collins if (isset($icon['$' . $i]) === true) { 1556ab45ba71SJames Collins $s = str_replace('$' . $i, $icon['$' . $i], $s); 1557ab45ba71SJames Collins } 1558ab45ba71SJames Collins } else { 1559ab45ba71SJames Collins $s = str_replace('$' . $i, $e[$i], $s); 1560ab45ba71SJames Collins } 1561ab45ba71SJames Collins } 1562ab45ba71SJames Collins 1563ab45ba71SJames Collins $dir = ''; 1564*9cff245bSJames Collins if (isset($icon['dir']) === true) { 1565*9cff245bSJames Collins $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/'; 1566*9cff245bSJames Collins } 1567ab45ba71SJames Collins 1568ab45ba71SJames Collins $s = str_replace('$0', $dir, $s); 1569ab45ba71SJames Collins 1570ab45ba71SJames Collins break; 1571*9cff245bSJames Collins }//end if 1572*9cff245bSJames Collins }//end foreach 1573ab45ba71SJames Collins } else { 1574ab45ba71SJames Collins $s = str_replace('$1', $matches[1], $icon['insert']); 1575*9cff245bSJames Collins }//end if 1576*9cff245bSJames Collins }//end if 1577*9cff245bSJames Collins }//end if 157875adba86SJames Collins 1579ab45ba71SJames Collins $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count); 1580*9cff245bSJames Collins if ($count === 0) { 1581ab45ba71SJames Collins $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s); 1582ab45ba71SJames Collins } 1583ab45ba71SJames Collins 1584ab45ba71SJames Collins return $s; 1585ab45ba71SJames Collins }, 158610b40067Snomadjimbob $icons[0] 158710b40067Snomadjimbob ); 1588a2005a27SJames Collins }, $content); 1589a2005a27SJames Collins 1590*9cff245bSJames Collins if ($ACT === 'preview') { 1591*9cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1592a2005a27SJames Collins $preview[0]->innertext = $content; 1593a2005a27SJames Collins } 1594a2005a27SJames Collins 1595a2005a27SJames Collins $str = $html->save(); 1596a2005a27SJames Collins $html->clear(); 1597a2005a27SJames Collins unset($html); 1598a2005a27SJames Collins } else { 1599a2005a27SJames Collins $str = $content; 1600a2005a27SJames Collins } 1601*9cff245bSJames Collins }//end if 1602ab45ba71SJames Collins 1603ab45ba71SJames Collins return $str; 1604ab45ba71SJames Collins } 160547161538SJames Collins 1606c165b184SJames Collins /** 1607a8eebd82SJames Collins * Parse HTML for theme 1608c165b184SJames Collins * 1609*9cff245bSJames Collins * @param string $content HTML content to parse. 1610a8eebd82SJames Collins * @return string Parsed content 1611c165b184SJames Collins */ 1612*9cff245bSJames Collins public function parseContent(string $content) 161310b40067Snomadjimbob { 1614ab45ba71SJames Collins global $INPUT, $ACT; 1615ab45ba71SJames Collins 1616a8eebd82SJames Collins // Add Mikio Section titles 1617*9cff245bSJames Collins if ($INPUT->str('page') === 'config') { 1618*9cff245bSJames Collins $admin_sections = [ 1619ab45ba71SJames Collins // Section Insert Before Icon 1620*9cff245bSJames Collins 'navbar' => ['navbarUseTitleIcon', ''], 1621*9cff245bSJames Collins 'search' => ['searchButton', ''], 1622*9cff245bSJames Collins 'hero' => ['heroTitle', ''], 1623*9cff245bSJames Collins 'tags' => ['tagsConsolidate', ''], 1624*9cff245bSJames Collins 'breadcrumb' => ['breadcrumbHideHome', ''], 1625*9cff245bSJames Collins 'youarehere' => ['youarehereHideHome', ''], 1626*9cff245bSJames Collins 'sidebar' => ['sidebarShowLeft', ''], 1627*9cff245bSJames Collins 'toc' => ['tocFull', ''], 1628*9cff245bSJames Collins 'pagetools' => ['pageToolsFloating', ''], 1629*9cff245bSJames Collins 'footer' => ['footerCustomMenuText', ''], 1630*9cff245bSJames Collins 'license' => ['licenseType', ''], 1631*9cff245bSJames Collins 'acl' => ['includePageUseACL', ''], 1632*9cff245bSJames Collins 'sticky' => ['stickyTopHeader', ''], 1633*9cff245bSJames Collins ]; 1634ab45ba71SJames Collins 1635ab45ba71SJames Collins foreach ($admin_sections as $section => $items) { 1636ab45ba71SJames Collins $search = $items[0]; 1637ab45ba71SJames Collins $icon = $items[1]; 1638ab45ba71SJames Collins 163910b40067Snomadjimbob $content = preg_replace( 1640adf52ebbSJames Collins '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/', 1641*9cff245bSJames Collins '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) . 1642*9cff245bSJames Collins tpl_getLang('config_' . $section) . 1643*9cff245bSJames Collins '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' . 1644*9cff245bSJames Collins $search . '</span>', 164510b40067Snomadjimbob $content 164610b40067Snomadjimbob ); 1647ab45ba71SJames Collins } 1648*9cff245bSJames Collins }//end if 1649ab45ba71SJames Collins 1650*9cff245bSJames Collins if ($ACT === 'admin' && isset($_GET['page']) === false) { 1651a8eebd82SJames Collins $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content); 1652a8eebd82SJames Collins } 1653ab45ba71SJames Collins 1654a8eebd82SJames Collins // Page Revisions - Table Fix 1655*9cff245bSJames Collins if (strpos($content, 'id="page__revisions"') !== false) { 1656*9cff245bSJames Collins $content = preg_replace( 1657*9cff245bSJames Collins '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/', 1658*9cff245bSJames Collins '<span>$1</span>', 1659*9cff245bSJames Collins $content 1660*9cff245bSJames Collins ); 1661a8eebd82SJames Collins } 1662ab45ba71SJames Collins 1663*9cff245bSJames Collins $html = new \simple_html_dom(); 1664bc1032d9SJames Collins $html->stripRNAttrValues = false; 1665c165b184SJames Collins $html->load($content, true, false); 1666c165b184SJames Collins 1667*9cff245bSJames Collins if ($html === false) { 1668*9cff245bSJames Collins return $content; 1669*9cff245bSJames Collins } 1670ab45ba71SJames Collins 1671ab45ba71SJames Collins /* Buttons */ 1672ab45ba71SJames Collins foreach ($html->find('#config__manager button') as $node) { 1673ab45ba71SJames Collins $c = explode(' ', $node->class); 1674*9cff245bSJames Collins if (in_array('mikio-button', $c) === false) { 1675*9cff245bSJames Collins $c[] = 'mikio-button'; 1676*9cff245bSJames Collins } 1677ab45ba71SJames Collins $node->class = implode(' ', $c); 1678c165b184SJames Collins } 1679c165b184SJames Collins 1680ab45ba71SJames Collins 1681ab45ba71SJames Collins /* Buttons - Primary */ 1682ab45ba71SJames Collins foreach ($html->find('#config__manager [type=submit]') as $node) { 1683ab45ba71SJames Collins $c = explode(' ', $node->class); 1684*9cff245bSJames Collins if (in_array('mikio-primary', $c) === false) { 1685*9cff245bSJames Collins $c[] = 'mikio-primary'; 1686*9cff245bSJames Collins } 1687ab45ba71SJames Collins $node->class = implode(' ', $c); 1688ab45ba71SJames Collins } 1689ab45ba71SJames Collins 1690a8eebd82SJames Collins /* Hide page title if hero is enabled */ 1691*9cff245bSJames Collins if ($this->getConf('heroTitle') === true && $ACT !== 'preview') { 16921785fc73SJames Collins $pageTitle = $this->parsePageTitle(); 169347161538SJames Collins 169447161538SJames Collins foreach ($html->find('h1,h2,h3,h4') as $elm) { 1695*9cff245bSJames Collins if ($elm->innertext === $pageTitle) { 1696a8eebd82SJames Collins // $elm->innertext = ''; 1697a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1698a8eebd82SJames Collins 169947161538SJames Collins break; 170047161538SJames Collins } 170147161538SJames Collins } 170247161538SJames Collins } 1703c165b184SJames Collins 1704a8eebd82SJames Collins /* Hero subtitle */ 17052b4583abSJames Collins foreach ($html->find('p') as $elm) { 17062b4583abSJames Collins $i = stripos($elm->innertext, '~~hero-subtitle'); 17072b4583abSJames Collins if ($i !== false) { 1708*9cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 17092b4583abSJames Collins if ($j !== false) { 1710*9cff245bSJames Collins if ($j > ($i + 16)) { 1711*9cff245bSJames Collins $subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16)); 1712a8eebd82SJames Collins $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')'; 1713a8eebd82SJames Collins 1714a8eebd82SJames Collins // $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2); 1715a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext); 17162b4583abSJames Collins } 17172b4583abSJames Collins 17182b4583abSJames Collins break; 17192b4583abSJames Collins } 17202b4583abSJames Collins } 17212b4583abSJames Collins } 17222b4583abSJames Collins 1723a8eebd82SJames Collins /* Hero image */ 1724a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1725a8eebd82SJames Collins $image = ''; 1726a8eebd82SJames Collins preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches); 1727a8eebd82SJames Collins if (count($matches) > 0) { 1728a8eebd82SJames Collins preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches); 1729a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1730a8eebd82SJames Collins $image = $imageTagMatches[1]; 1731a8eebd82SJames Collins } else { 1732a8eebd82SJames Collins preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches); 1733a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1734a8eebd82SJames Collins $image = $imageTagMatches[1]; 1735a8eebd82SJames Collins } else { 1736a8eebd82SJames Collins $image = strip_tags($matches[1]); 1737*9cff245bSJames Collins if (stripos($image, ':') === false) { 1738*9cff245bSJames Collins $image = str_replace(['{', '}'], '', $image); 1739a8eebd82SJames Collins $i = stripos($image, '?'); 1740*9cff245bSJames Collins if ($i !== false) { 1741a8eebd82SJames Collins $image = substr($image, 0, $i); 1742c165b184SJames Collins } 1743c165b184SJames Collins 1744a8eebd82SJames Collins $image = ml($image, '', true, '', false); 1745ab45ba71SJames Collins } 1746ab45ba71SJames Collins } 1747ab45ba71SJames Collins } 1748ab45ba71SJames Collins 1749a8eebd82SJames Collins $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')'; 1750a8eebd82SJames Collins 1751a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext); 1752*9cff245bSJames Collins }//end if 1753*9cff245bSJames Collins }//end foreach 1754ab45ba71SJames Collins 1755*9cff245bSJames Collins /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color] 1756*9cff245bSJames Collins [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */ 1757a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1758a8eebd82SJames Collins $i = stripos($elm->innertext, '~~hero-colors'); 1759a8eebd82SJames Collins if ($i !== false) { 1760*9cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 1761a8eebd82SJames Collins if ($j !== false) { 1762*9cff245bSJames Collins if ($j > ($i + 14)) { 1763*9cff245bSJames Collins $color = substr($elm->innertext, ($i + 14), ($j - $i - 14)); 1764a8eebd82SJames Collins $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')'; 1765ab45ba71SJames Collins 1766a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext); 1767ab45ba71SJames Collins } 1768ab45ba71SJames Collins 1769a8eebd82SJames Collins break; 1770ab45ba71SJames Collins } 1771ab45ba71SJames Collins } 1772ab45ba71SJames Collins } 1773ab45ba71SJames Collins 177496ec8e1eSJames Collins /* Hide parts - ~~hide-parts [parts]~~ */ 177596ec8e1eSJames Collins foreach ($html->find('p') as $elm) { 177696ec8e1eSJames Collins $i = stripos($elm->innertext, '~~hide-parts'); 177796ec8e1eSJames Collins if ($i !== false) { 1778*9cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 177996ec8e1eSJames Collins if ($j !== false) { 1780*9cff245bSJames Collins if ($j > ($i + 13)) { 1781*9cff245bSJames Collins $parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13))); 178296ec8e1eSJames Collins $script = ''; 178396ec8e1eSJames Collins 178496ec8e1eSJames Collins foreach ($parts as $part) { 178596ec8e1eSJames Collins // $part = trim($part); 178696ec8e1eSJames Collins if (strlen($part) > 0) { 178796ec8e1eSJames Collins $script .= 'mikio.hidePart(\'' . $part . '\');'; 178896ec8e1eSJames Collins } 178996ec8e1eSJames Collins } 179096ec8e1eSJames Collins 179196ec8e1eSJames Collins if (strlen($script) > 0) { 179296ec8e1eSJames Collins $this->footerScript['hide-parts'] = $script; 179396ec8e1eSJames Collins } 179496ec8e1eSJames Collins 179596ec8e1eSJames Collins $elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext); 179696ec8e1eSJames Collins } 179796ec8e1eSJames Collins 179896ec8e1eSJames Collins break; 1799*9cff245bSJames Collins }//end if 1800*9cff245bSJames Collins }//end if 1801*9cff245bSJames Collins }//end foreach 180296ec8e1eSJames Collins 180396ec8e1eSJames Collins 1804a8eebd82SJames Collins /* Page Tags (tag plugin) */ 1805*9cff245bSJames Collins if ($this->getConf('tagsConsolidate') === true) { 1806a8eebd82SJames Collins $tags = ''; 1807a8eebd82SJames Collins foreach ($html->find('div.tags a') as $elm) { 1808a8eebd82SJames Collins $tags .= $elm->outertext; 1809a8eebd82SJames Collins } 1810a8eebd82SJames Collins 1811a8eebd82SJames Collins foreach ($html->find('div.tags') as $elm) { 1812a8eebd82SJames Collins $elm->innertext = ''; 1813a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1814a8eebd82SJames Collins } 1815a8eebd82SJames Collins 1816*9cff245bSJames Collins if ($tags !== '') { 1817a8eebd82SJames Collins $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')'; 1818a8eebd82SJames Collins } 1819ab45ba71SJames Collins } 1820ab45ba71SJames Collins 1821ab45ba71SJames Collins // Configuration Manager 1822*9cff245bSJames Collins if ($INPUT->str('page') === 'config') { 1823ab45ba71SJames Collins // Additional save buttons 1824ab45ba71SJames Collins foreach ($html->find('#config__manager') as $cm) { 1825ab45ba71SJames Collins $saveButtons = ''; 1826ab45ba71SJames Collins 1827ab45ba71SJames Collins foreach ($cm->find('p') as $elm) { 1828ab45ba71SJames Collins $saveButtons = $elm->outertext; 1829a8eebd82SJames Collins $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons); 1830ab45ba71SJames Collins $elm->outertext = ''; 1831ab45ba71SJames Collins } 1832ab45ba71SJames Collins 1833ab45ba71SJames Collins foreach ($cm->find('fieldset') as $elm) { 1834ab45ba71SJames Collins $elm->innertext .= $saveButtons; 1835ab45ba71SJames Collins } 1836ab45ba71SJames Collins } 1837ab45ba71SJames Collins } 1838ab45ba71SJames Collins 1839ab45ba71SJames Collins $content = $html->save(); 1840c165b184SJames Collins $html->clear(); 1841c165b184SJames Collins unset($html); 1842c165b184SJames Collins 1843c165b184SJames Collins return $content; 1844c165b184SJames Collins } 18452b4583abSJames Collins 18462b4583abSJames Collins 1847a8eebd82SJames Collins /** 1848a8eebd82SJames Collins * Get DokuWiki namespace/page/URI as link 1849a8eebd82SJames Collins * 1850*9cff245bSJames Collins * @param string $str String to parse. 1851*9cff245bSJames Collins * @return string parsed URI 1852a8eebd82SJames Collins */ 1853*9cff245bSJames Collins public function getLink(string $str) 185410b40067Snomadjimbob { 18552b4583abSJames Collins $i = strpos($str, '://'); 1856*9cff245bSJames Collins if ($i !== false) { 1857*9cff245bSJames Collins return $str; 1858*9cff245bSJames Collins } 18592b4583abSJames Collins 18602b4583abSJames Collins return wl($str); 18612b4583abSJames Collins } 1862ab45ba71SJames Collins 1863ab45ba71SJames Collins 1864a8eebd82SJames Collins /** 1865a8eebd82SJames Collins * Check if the user can edit current namespace/page 1866a8eebd82SJames Collins * 1867a8eebd82SJames Collins * @return boolean user can edit 1868a8eebd82SJames Collins */ 186910b40067Snomadjimbob public function userCanEdit() 187010b40067Snomadjimbob { 1871ab45ba71SJames Collins global $INFO; 1872ab45ba71SJames Collins global $ID; 1873ab45ba71SJames Collins 1874ab45ba71SJames Collins $wiki_file = wikiFN($ID); 1875*9cff245bSJames Collins if (@file_exists($wiki_file) === false) { 1876*9cff245bSJames Collins return true; 1877*9cff245bSJames Collins } 1878*9cff245bSJames Collins if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) { 1879*9cff245bSJames Collins return true; 1880*9cff245bSJames Collins } 1881a8eebd82SJames Collins // $meta_file = metaFN($ID, '.meta'); 1882*9cff245bSJames Collins if ($INFO['meta']['user'] === false) { 1883*9cff245bSJames Collins return true; 1884*9cff245bSJames Collins } 1885*9cff245bSJames Collins if ($INFO['client'] === $INFO['meta']['user']) { 1886*9cff245bSJames Collins return true; 1887*9cff245bSJames Collins } 1888ab45ba71SJames Collins 1889ab45ba71SJames Collins return false; 1890c165b184SJames Collins } 189147161538SJames Collins 189247161538SJames Collins 1893a8eebd82SJames Collins /** 1894a8eebd82SJames Collins * Search for and return the uri of a media file 1895a8eebd82SJames Collins * 1896*9cff245bSJames Collins * @param string $image Image name to search for (without extension). 1897*9cff245bSJames Collins * @param boolean $searchCurrentNS Search the current namespace. 1898*9cff245bSJames Collins * @param boolean $propagate Propagate search through the namespace. 1899*9cff245bSJames Collins * @return string URI of the found media file 1900a8eebd82SJames Collins */ 1901*9cff245bSJames Collins public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true) 190210b40067Snomadjimbob { 1903ab45ba71SJames Collins global $INFO; 1904a8eebd82SJames Collins 1905*9cff245bSJames Collins $ext = ['png', 'jpg', 'gif', 'svg']; 1906ab45ba71SJames Collins 1907*9cff245bSJames Collins if ($searchCurrentNS === true) { 1908*9cff245bSJames Collins $prefix[] = ':' . $INFO['namespace'] . ':'; 1909*9cff245bSJames Collins } 1910*9cff245bSJames Collins if ($propagate === true) { 1911ab45ba71SJames Collins $prefix[] = ':'; 1912ab45ba71SJames Collins $prefix[] = ':wiki:'; 1913a8eebd82SJames Collins } 1914ab45ba71SJames Collins $theme = $this->getConf('customTheme'); 1915*9cff245bSJames Collins if ($theme !== '') { 1916*9cff245bSJames Collins $prefix[] = 'themes/' . $theme . '/images/'; 1917*9cff245bSJames Collins } 1918ab45ba71SJames Collins $prefix[] = 'images/'; 1919ab45ba71SJames Collins 1920*9cff245bSJames Collins $search = []; 1921ab45ba71SJames Collins foreach ($prefix as $pitem) { 1922ab45ba71SJames Collins foreach ($ext as $eitem) { 1923ab45ba71SJames Collins $search[] = $pitem . $image . '.' . $eitem; 1924ab45ba71SJames Collins } 1925ab45ba71SJames Collins } 1926ab45ba71SJames Collins 1927ab45ba71SJames Collins $img = ''; 1928ab45ba71SJames Collins $file = ''; 1929ab45ba71SJames Collins $url = ''; 1930ab45ba71SJames Collins $ismedia = false; 1931ab45ba71SJames Collins $found = false; 1932ab45ba71SJames Collins 1933ab45ba71SJames Collins foreach ($search as $img) { 1934*9cff245bSJames Collins if (substr($img, 0, 1) === ':') { 1935ab45ba71SJames Collins $file = mediaFN($img); 1936ab45ba71SJames Collins $ismedia = true; 1937ab45ba71SJames Collins } else { 1938ab45ba71SJames Collins $file = tpl_incdir() . $img; 1939ab45ba71SJames Collins $ismedia = false; 1940ab45ba71SJames Collins } 1941ab45ba71SJames Collins 1942*9cff245bSJames Collins if (file_exists($file) === true) { 1943ab45ba71SJames Collins $found = true; 1944ab45ba71SJames Collins break; 1945ab45ba71SJames Collins } 1946ab45ba71SJames Collins } 1947ab45ba71SJames Collins 1948*9cff245bSJames Collins if ($found === false) { 1949*9cff245bSJames Collins return false; 1950*9cff245bSJames Collins } 1951ab45ba71SJames Collins 1952*9cff245bSJames Collins if ($ismedia === true) { 1953ab45ba71SJames Collins $url = ml($img, '', true, '', false); 1954ab45ba71SJames Collins } else { 1955ab45ba71SJames Collins $url = tpl_basedir() . $img; 1956ab45ba71SJames Collins } 1957ab45ba71SJames Collins 1958ab45ba71SJames Collins return $url; 1959ab45ba71SJames Collins } 1960ab45ba71SJames Collins 1961a8eebd82SJames Collins 1962a8eebd82SJames Collins /** 1963ab45ba71SJames Collins * Print or return the page title 1964ab45ba71SJames Collins * 1965*9cff245bSJames Collins * @param string $page Page id or empty string for current page. 1966ab45ba71SJames Collins * @return string generated content 1967ab45ba71SJames Collins */ 1968*9cff245bSJames Collins public function getPageTitle(string $page = '') 196910b40067Snomadjimbob { 1970ab45ba71SJames Collins global $ID, $conf; 1971ab45ba71SJames Collins 1972ab45ba71SJames Collins $html = ''; 1973ab45ba71SJames Collins 1974*9cff245bSJames Collins if ($page === '') { 1975*9cff245bSJames Collins $page = $ID; 1976*9cff245bSJames Collins } 1977ab45ba71SJames Collins 1978ab45ba71SJames Collins $html = p_get_first_heading($page); 1979ab45ba71SJames Collins $html = strip_tags($html); 1980ab45ba71SJames Collins $html = preg_replace('/\s+/', ' ', $html); 1981ab45ba71SJames Collins $html .= ' [' . strip_tags($conf['title']) . ']'; 1982ab45ba71SJames Collins $html = trim($html); 1983ab45ba71SJames Collins 1984ab45ba71SJames Collins return $html; 1985ab45ba71SJames Collins } 1986a8eebd82SJames Collins 1987a8eebd82SJames Collins 1988a8eebd82SJames Collins /** 1989a8eebd82SJames Collins * Return inline theme icon 1990a8eebd82SJames Collins * 1991*9cff245bSJames Collins * @param string $type Icon to retreive. 1992*9cff245bSJames Collins * @return string HTML icon content 1993a8eebd82SJames Collins */ 1994*9cff245bSJames Collins public function mikioInlineIcon(string $type) 199510b40067Snomadjimbob { 1996a8eebd82SJames Collins switch ($type) { 1997a8eebd82SJames Collins case 'wrench': 1998*9cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 1999*9cff245bSJames 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 2000*9cff245bSJames 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 2001*9cff245bSJames 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 2002*9cff245bSJames 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, 2003*9cff245bSJames 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, 2004*9cff245bSJames 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>'; 2005a8eebd82SJames Collins case 'file': 2006*9cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 2007*9cff245bSJames 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 2008*9cff245bSJames 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, 2009*9cff245bSJames 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 2010*9cff245bSJames Collinsl 408,-408 q 28,-28 48,-76 20,-48 20,-88 z" id="path2993" inkscape:connector-curvature="0" 2011*9cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 2012a8eebd82SJames Collins case 'gear': 2013*9cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 2014*9cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027"><path d="m 1024,640 q 0,106 2015*9cff245bSJames 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 2016*9cff245bSJames 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, 2017*9cff245bSJames 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 2018*9cff245bSJames 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 2019*9cff245bSJames 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, 2020*9cff245bSJames 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 2021*9cff245bSJames 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 2022*9cff245bSJames 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 2023*9cff245bSJames 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>'; 2024a8eebd82SJames Collins case 'user': 2025*9cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 2026*9cff245bSJames 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 2027*9cff245bSJames 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 2028*9cff245bSJames 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 2029*9cff245bSJames 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 2030*9cff245bSJames 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 2031*9cff245bSJames 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 2032*9cff245bSJames Collins1088,1024 z"/></g></svg>'; 2033a8eebd82SJames Collins case 'search': 2034*9cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" 2035*9cff245bSJames 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 2036*9cff245bSJames 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 2037*9cff245bSJames 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 2038*9cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>'; 2039a8eebd82SJames Collins case 'home': 2040*9cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 2041*9cff245bSJames Collinsaria-hidden="true" style="fill:currentColor"><g transform="matrix(1,0,0,-1,68.338983,1285.4237)" id="g3015"> 2042*9cff245bSJames 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, 2043*9cff245bSJames 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, 2044*9cff245bSJames 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, 2045*9cff245bSJames 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, 2046*9cff245bSJames Collins-182 q 10,-8 11,-21.5 1,-13.5 -7,-23.5 z" id="path3017" inkscape:connector-curvature="0" 2047*9cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 2048*9cff245bSJames Collins }//end switch 2049ab45ba71SJames Collins 2050a8eebd82SJames Collins return ''; 2051a8eebd82SJames Collins } 2052ab45ba71SJames Collins 2053a8eebd82SJames Collins /** 2054a8eebd82SJames Collins * Finalize theme 2055*9cff245bSJames Collins * 2056*9cff245bSJames Collins * @return void 2057a8eebd82SJames Collins */ 205810b40067Snomadjimbob public function finalize() 205910b40067Snomadjimbob { 2060a8eebd82SJames Collins } 20611785fc73SJames Collins 20621785fc73SJames Collins /** 20631785fc73SJames Collins * Show Messages 2064*9cff245bSJames Collins * 2065*9cff245bSJames Collins * @return void 20661785fc73SJames Collins */ 206710b40067Snomadjimbob public function showMessages() 206810b40067Snomadjimbob { 20691785fc73SJames Collins global $ACT; 20701785fc73SJames Collins 2071*9cff245bSJames Collins if ($this->lessIgnored === true) { 2072*9cff245bSJames Collins msg( 2073*9cff245bSJames Collins 'useLESS is enabled on the Mikio template, however is not supported on this server', 2074*9cff245bSJames Collins 2, 2075*9cff245bSJames Collins '', 2076*9cff245bSJames Collins '', 2077*9cff245bSJames Collins MSG_ADMINS_ONLY 2078*9cff245bSJames Collins ); 2079a8df40efSJames Collins } 2080a8df40efSJames Collins 20811785fc73SJames Collins $show = $this->getConf('showNotifications'); 2082*9cff245bSJames Collins if ($show === 'always' || ($show === 'admin' && $ACT === 'admin')) { 20831785fc73SJames Collins global $MSG, $MSG_shown; 20841785fc73SJames Collins 2085*9cff245bSJames Collins if (isset($MSG) === false) { 20861785fc73SJames Collins return; 20871785fc73SJames Collins } 20881785fc73SJames Collins 2089*9cff245bSJames Collins if (isset($MSG_shown) === false) { 2090*9cff245bSJames Collins $MSG_shown = []; 2091a8df40efSJames Collins } 20921785fc73SJames Collins 20931785fc73SJames Collins foreach ($MSG as $msg) { 20941785fc73SJames Collins $hash = md5($msg['msg']); 2095*9cff245bSJames Collins if (isset($MSG_shown[$hash]) === true) { 20961785fc73SJames Collins continue; 20971785fc73SJames Collins } 20981785fc73SJames Collins // skip double messages 20991785fc73SJames Collins 2100*9cff245bSJames Collins if (info_msg_allowed($msg) === true) { 2101*9cff245bSJames Collins echo '<div class="' . $msg['lvl'] . '">'; 2102*9cff245bSJames Collins echo $msg['msg']; 2103*9cff245bSJames Collins echo '</div>'; 21041785fc73SJames Collins } 21051785fc73SJames Collins 2106a8df40efSJames Collins $MSG_shown[$hash] = true; 21071785fc73SJames Collins } 21081785fc73SJames Collins 21091785fc73SJames Collins unset($GLOBALS['MSG']); 2110*9cff245bSJames Collins }//end if 21111785fc73SJames Collins } 21127ac0a6efSJames Collins 21137ac0a6efSJames Collins /** 21147ac0a6efSJames Collins * Dokuwiki version 21157ac0a6efSJames Collins * 21167ac0a6efSJames Collins * @return string the dw version name 21177ac0a6efSJames Collins */ 2118*9cff245bSJames Collins public function dwVersion() 2119*9cff245bSJames Collins { 2120*9cff245bSJames Collins if (function_exists('getVersionData') === true) { 21217ac0a6efSJames Collins $version_data = getVersionData(); 2122*9cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 21237ac0a6efSJames Collins $version_items = explode(' ', $version_data['date']); 21247ac0a6efSJames Collins if (count($version_items) >= 2) { 21257ac0a6efSJames Collins return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1])); 21267ac0a6efSJames Collins } 21277ac0a6efSJames Collins } 21287ac0a6efSJames Collins } 21297ac0a6efSJames Collins 21307ac0a6efSJames Collins return 'unknown'; 21317ac0a6efSJames Collins } 2132e4c4fb13SJames Collins 2133e4c4fb13SJames Collins /** 2134e4c4fb13SJames Collins * Dokuwiki version number 2135e4c4fb13SJames Collins * 2136e4c4fb13SJames Collins * @return string the dw version date converted to integer 2137e4c4fb13SJames Collins */ 2138*9cff245bSJames Collins public function dwVersionNumber() 2139*9cff245bSJames Collins { 2140*9cff245bSJames Collins if (function_exists('getVersionData') === true) { 2141e4c4fb13SJames Collins $version_data = getVersionData(); 2142*9cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 2143e4c4fb13SJames Collins $version_items = explode(' ', $version_data['date']); 2144e4c4fb13SJames Collins if (count($version_items) >= 1) { 2145e4c4fb13SJames Collins return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0]))); 2146e4c4fb13SJames Collins } 2147e4c4fb13SJames Collins } 2148e4c4fb13SJames Collins } 2149e4c4fb13SJames Collins 2150e4c4fb13SJames Collins return 0; 2151e4c4fb13SJames Collins } 2152a8eebd82SJames Collins} 2153ab45ba71SJames Collins 2154ab45ba71SJames Collinsglobal $TEMPLATE; 215547161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance(); 2156