1c165b184SJames Collins<?php 210b40067Snomadjimbob 3c165b184SJames Collins/** 4c165b184SJames Collins * DokuWiki Mikio Template 5c165b184SJames Collins * 6c165b184SJames Collins * @link http://dokuwiki.org/template:mikio 7c165b184SJames Collins * @author James Collins <james.collins@outlook.com.au> 8ab45ba71SJames Collins * @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html) 9c165b184SJames Collins */ 1010b40067Snomadjimbob 11ab45ba71SJames Collinsnamespace dokuwiki\template\mikio; 12c165b184SJames Collins 139cff245bSJames Collinsif (defined('DOKU_INC') === false) { 149cff245bSJames Collins die(); 159cff245bSJames Collins} 16c165b184SJames Collins 17ab45ba71SJames Collinsrequire_once('icons/icons.php'); 18c165b184SJames Collinsrequire_once('inc/simple_html_dom.php'); 19*daf2cd7aSJames Collinsrequire_once('inc/parens-parser.php'); 20c165b184SJames Collins 2110b40067Snomadjimbobclass Template 2210b40067Snomadjimbob{ 239cff245bSJames Collins /** 249cff245bSJames Collins * @var string Template directory path from local FS. 259cff245bSJames Collins */ 26c165b184SJames Collins public $tplDir = ''; 279cff245bSJames Collins 289cff245bSJames Collins /** 299cff245bSJames Collins * @var string Template directory path from web. 309cff245bSJames Collins */ 31c165b184SJames Collins public $baseDir = ''; 329cff245bSJames Collins 339cff245bSJames Collins /** 349cff245bSJames Collins * @var array Array of Javascript files to include in footer. 359cff245bSJames Collins */ 369cff245bSJames Collins public $footerScript = []; 379cff245bSJames Collins 389cff245bSJames Collins /** 399cff245bSJames Collins * @var boolean Ignore LESS files. 409cff245bSJames Collins */ 41a8df40efSJames Collins public $lessIgnored = false; 42c165b184SJames Collins 434f8225e4SJames Collins /** 444f8225e4SJames Collins * @var string Notifications from included pages. 454f8225e4SJames Collins */ 464f8225e4SJames Collins private $includedPageNotifications = ''; 474f8225e4SJames Collins 48c165b184SJames Collins 49c165b184SJames Collins /** 50c165b184SJames Collins * Class constructor 51c165b184SJames Collins */ 5210b40067Snomadjimbob public function __construct() 5310b40067Snomadjimbob { 54c165b184SJames Collins $this->tplDir = tpl_incdir(); 55c165b184SJames Collins $this->baseDir = tpl_basedir(); 56c165b184SJames Collins 579cff245bSJames Collins $this->registerHooks(); 58c165b184SJames Collins } 59c165b184SJames Collins 60c165b184SJames Collins /** 61ab45ba71SJames Collins * Returns the instance of the class 6247161538SJames Collins * 63ab45ba71SJames Collins * @return Template class instance 6447161538SJames Collins */ 6547161538SJames Collins public static function getInstance() 6647161538SJames Collins { 6747161538SJames Collins static $instance = null; 6847161538SJames Collins 693a385f2cSJames Collins if (empty($instance) === true) { 7047161538SJames Collins $instance = new Template(); 7147161538SJames Collins } 7247161538SJames Collins 7347161538SJames Collins return $instance; 7447161538SJames Collins } 7547161538SJames Collins 76ab45ba71SJames Collins 7747161538SJames Collins /** 78ab45ba71SJames Collins * Register the themes hooks into Dokuwiki 799cff245bSJames Collins * 809cff245bSJames Collins * @return void 81c165b184SJames Collins */ 829cff245bSJames Collins private function registerHooks() 8310b40067Snomadjimbob { 84c165b184SJames Collins global $EVENT_HANDLER; 85c165b184SJames Collins 869cff245bSJames Collins $events_dispatcher = [ 87ab45ba71SJames Collins 'TPL_METAHEADER_OUTPUT' => 'metaheadersHandler' 889cff245bSJames Collins ]; 89c165b184SJames Collins 90c165b184SJames Collins foreach ($events_dispatcher as $event => $method) { 91c165b184SJames Collins $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method); 92c165b184SJames Collins } 93c165b184SJames Collins } 94c165b184SJames Collins 95c165b184SJames Collins 96c165b184SJames Collins /** 97ab45ba71SJames Collins * Meta handler hook for DokuWiki 98c165b184SJames Collins * 999cff245bSJames Collins * @param \Doku_Event $event DokuWiki Event. 1009cff245bSJames Collins * @return void 101c165b184SJames Collins */ 10210b40067Snomadjimbob public function metaHeadersHandler(\Doku_Event $event) 10310b40067Snomadjimbob { 104ab45ba71SJames Collins global $MIKIO_ICONS; 105b5536b07SChris MacMackin global $conf; 106ab45ba71SJames Collins 107ad182e6dSnomadjimbob global $MIKIO_TEMPLATE; 108ad182e6dSnomadjimbob $MIKIO_TEMPLATE = '123'; 109ad182e6dSnomadjimbob 1109cff245bSJames Collins $this->includePage('theme', false, true); 111a8eebd82SJames Collins 1129cff245bSJames Collins $stylesheets = []; 1139cff245bSJames Collins $scripts = []; 114c165b184SJames Collins 1153a385f2cSJames Collins if (empty($this->getConf('customTheme')) === false) { 1169cff245bSJames Collins if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) { 117a8eebd82SJames Collins $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less'; 118a8eebd82SJames Collins } else { 1199cff245bSJames Collins if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) { 120ab45ba71SJames Collins $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css'; 1212b4583abSJames Collins } 122a8eebd82SJames Collins } 1239cff245bSJames Collins if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) { 124ab45ba71SJames Collins $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js'; 125c165b184SJames Collins } 126c165b184SJames Collins } 127c165b184SJames Collins 1283a385f2cSJames Collins if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) { 1299cff245bSJames Collins $icons = []; 130ab45ba71SJames Collins foreach ($MIKIO_ICONS as $icon) { 1319cff245bSJames Collins if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) { 132ab45ba71SJames Collins $icons[] = $icon; 133c165b184SJames Collins 1343a385f2cSJames Collins if (empty($icon['css']) === false) { 1359cff245bSJames Collins if (strpos($icon['css'], '//') === false) { 136a8eebd82SJames Collins $stylesheets[] = $this->baseDir . 'icons/' . $icon['css']; 137ab45ba71SJames Collins } else { 138a8eebd82SJames Collins $stylesheets[] = $icon['css']; 139ab45ba71SJames Collins } 140ab45ba71SJames Collins } 141ab45ba71SJames Collins } 142ab45ba71SJames Collins } 143ab45ba71SJames Collins $MIKIO_ICONS = $icons; 144ab45ba71SJames Collins } else { 145ab45ba71SJames Collins $MIKIO_ICONS = []; 146ab45ba71SJames Collins } 147c165b184SJames Collins 1487864545bSChris MacMackin $scripts[] = $this->baseDir . 'assets/mikio-typeahead.js'; 149ab45ba71SJames Collins $scripts[] = $this->baseDir . 'assets/mikio.js'; 150644fd9f9SJames Collins 1519cff245bSJames Collins if ($this->getConf('useLESS') === true) { 152ab45ba71SJames Collins $stylesheets[] = $this->baseDir . 'assets/mikio.less'; 153644fd9f9SJames Collins } else { 154644fd9f9SJames Collins $stylesheets[] = $this->baseDir . 'assets/mikio.css'; 155644fd9f9SJames Collins } 156644fd9f9SJames Collins 157ad182e6dSnomadjimbob /* MikioPlugin Support */ 1589ffe9161Snomadjimbob if (plugin_load('action', 'mikioplugin') !== null) { 159ad182e6dSnomadjimbob if ($this->getConf('useLESS') === true) { 160ad182e6dSnomadjimbob $stylesheets[] = $this->baseDir . 'assets/mikioplugin.less'; 161ad182e6dSnomadjimbob } else { 162ad182e6dSnomadjimbob $stylesheets[] = $this->baseDir . 'assets/mikioplugin.css'; 163ad182e6dSnomadjimbob } 164ad182e6dSnomadjimbob } 165ab45ba71SJames Collins 166ab45ba71SJames Collins $set = []; 167c165b184SJames Collins foreach ($stylesheets as $style) { 1689cff245bSJames Collins if (in_array($style, $set) === false) { 1693a385f2cSJames Collins if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) { 170ab45ba71SJames Collins $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style); 171ab45ba71SJames Collins } 172ab45ba71SJames Collins 1739cff245bSJames Collins array_unshift($event->data['link'], [ 174c165b184SJames Collins 'type' => 'text/css', 175c165b184SJames Collins 'rel' => 'stylesheet', 176c165b184SJames Collins 'href' => $style 1779cff245bSJames Collins ]); 178c165b184SJames Collins } 179ab45ba71SJames Collins $set[] = $style; 180ab45ba71SJames Collins } 181c165b184SJames Collins 182ab45ba71SJames Collins $set = []; 183c165b184SJames Collins foreach ($scripts as $script) { 1849cff245bSJames Collins if (in_array($script, $set) === false) { 1859cff245bSJames Collins $script_params = [ 186c165b184SJames Collins 'type' => 'text/javascript', 187c165b184SJames Collins '_data' => '', 1888395cdcbSChris MacMackin 'src' => $script 1899cff245bSJames Collins ]; 190c1ecb866SJames Collins 191c1ecb866SJames Collins // equal to or greator than hogfather 192c1ecb866SJames Collins if ($this->dwVersionNumber() >= 20200729) { 193c1ecb866SJames Collins // greator than hogfather - defer always on 194c1ecb866SJames Collins if ($this->dwVersionNumber() >= 20200729) { 195c1ecb866SJames Collins $script_params += ['defer' => 'defer']; 196c1ecb866SJames Collins } else { 197c1ecb866SJames Collins // hogfather - defer always on unless $conf['defer_js'] is false 1989cff245bSJames Collins if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) { 1998395cdcbSChris MacMackin $script_params += ['defer' => 'defer']; 2008395cdcbSChris MacMackin } 201c1ecb866SJames Collins } 202c1ecb866SJames Collins } 203c1ecb866SJames Collins 2048395cdcbSChris MacMackin $event->data['script'][] = $script_params; 2059cff245bSJames Collins }//end if 206ab45ba71SJames Collins $set[] = $script; 2079cff245bSJames Collins }//end foreach 208c165b184SJames Collins } 209c165b184SJames Collins 210c165b184SJames Collins 211c165b184SJames Collins /** 212a8eebd82SJames Collins * Print or return the footer meta data 213c165b184SJames Collins * 2149cff245bSJames Collins * @param boolean $print Print the data to buffer. 2159cff245bSJames Collins * @return string HTML footer meta data 216c165b184SJames Collins */ 2179cff245bSJames Collins public function includeFooterMeta(bool $print = true) 21810b40067Snomadjimbob { 219a8eebd82SJames Collins $html = ''; 220a8eebd82SJames Collins 221a8eebd82SJames Collins if (count($this->footerScript) > 0) { 222a8eebd82SJames Collins $html .= '<script type="text/javascript">function mikioFooterRun() {'; 223a8eebd82SJames Collins foreach ($this->footerScript as $script) { 224a8eebd82SJames Collins $html .= $script . ';'; 225a8eebd82SJames Collins } 226a8eebd82SJames Collins $html .= '}</script>'; 227a8eebd82SJames Collins } 228c165b184SJames Collins 229c165b184SJames Collins 2309cff245bSJames Collins if ($print === true) { 2319cff245bSJames Collins echo $html; 2329cff245bSJames Collins } 233a8eebd82SJames Collins return $html; 234a8eebd82SJames Collins } 235a8eebd82SJames Collins 23695372bffSJames Collins 23795372bffSJames Collins // phpcs:disable Squiz.Commenting.FunctionComment.TypeHintMissing 23895372bffSJames Collins 23995372bffSJames Collins 240a8eebd82SJames Collins /** 241ab45ba71SJames Collins * Retreive and parse theme configuration options 242c165b184SJames Collins * 2439cff245bSJames Collins * @param string $key The configuration key to retreive. 2449cff245bSJames Collins * @param mixed $default If key doesn't exist, return this value. 245ab45ba71SJames Collins * @return mixed parsed value of configuration 246c165b184SJames Collins */ 24795372bffSJames Collins public function getConf(string $key, $default = false) 24810b40067Snomadjimbob { 249c165b184SJames Collins $value = tpl_getConf($key, $default); 250c165b184SJames Collins 2513a385f2cSJames Collins $data = [ 2523a385f2cSJames Collins ['keys' => ['navbarDWMenuType'], 'type' => 'choice', 2533a385f2cSJames Collins 'values' => ['both', 'icons', 'text'] 2543a385f2cSJames Collins ], 2553a385f2cSJames Collins ['keys' => ['navbarDWMenuCombine'], 'type' => 'choice', 2563a385f2cSJames Collins 'values' => ['combine', 'seperate', 'dropdown'] 2573a385f2cSJames Collins ], 2583a385f2cSJames Collins ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'], 2593a385f2cSJames Collins 'type' => 'choice', 2603a385f2cSJames Collins 'values' => ['none', 'custom', 'search', 'dokuwiki'], 2613a385f2cSJames Collins 'default' => [ 2623a385f2cSJames Collins 'navbarPosLeft' => 'none', 2633a385f2cSJames Collins 'navbarPosMiddle' => 'search', 2643a385f2cSJames Collins 'navbarPosRight' => 'dokuwiki' 2653a385f2cSJames Collins ] 2663a385f2cSJames Collins ], 2673a385f2cSJames Collins ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink', 2683a385f2cSJames Collins 'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile', 2693a385f2cSJames Collins 'navbarItemShowAdmin' 2703a385f2cSJames Collins ], 2713a385f2cSJames Collins 'type' => 'choice', 2723a385f2cSJames Collins 'values' => ['always', 'logged in', 'logged out', 'never'] 2733a385f2cSJames Collins ], 2743a385f2cSJames Collins ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'], 2753a385f2cSJames Collins 'type' => 'choice', 2763a385f2cSJames Collins 'values' => ['always', 'never'] 2773a385f2cSJames Collins ], 2783a385f2cSJames Collins ['keys' => ['searchButton'], 'type' => 'choice', 2793a385f2cSJames Collins 'values' => ['icon', 'text'] 2803a385f2cSJames Collins ], 2813a385f2cSJames Collins ['keys' => ['breadcrumbPosition', 'youareherePosition'], 2823a385f2cSJames Collins 'type' => 'choice', 2833a385f2cSJames Collins 'values' => ['top', 'hero', 'page', 'none'] 2843a385f2cSJames Collins ], 2853a385f2cSJames Collins ['keys' => ['youarehereHome'], 'type' => 'choice', 2863a385f2cSJames Collins 'values' => ['page title', 'home', 'icon', 'none'] 2873a385f2cSJames Collins ], 2883a385f2cSJames Collins ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'], 2893a385f2cSJames Collins 'type' => 'choice', 2903a385f2cSJames Collins 'values' => ['none', 'logged in user', 'search', 'content', 'tags'], 2913a385f2cSJames Collins 'default' => [ 2923a385f2cSJames Collins 'sidebarLeftRow1' => 'logged in user', 2933a385f2cSJames Collins 'sidebarLeftRow2' => 'search', 2943a385f2cSJames Collins 'sidebarLeftRow3' => 'content' 2953a385f2cSJames Collins ] 2963a385f2cSJames Collins ], 2973a385f2cSJames Collins ['keys' => ['pageToolsFloating', 'pageToolsFooter'], 2983a385f2cSJames Collins 'type' => 'choice', 2993a385f2cSJames Collins 'values' => ['always', 'none', 'page editors'] 3003a385f2cSJames Collins ], 3013a385f2cSJames Collins ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink', 3023a385f2cSJames Collins 'pageToolsShowTop' 3033a385f2cSJames Collins ], 3043a385f2cSJames Collins 'type' => 'choice', 3053a385f2cSJames Collins 'values' => ['always', 'logged in', 'logged out', 'never'] 3063a385f2cSJames Collins ], 3073a385f2cSJames Collins ['keys' => ['showNotifications'], 'type' => 'choice', 3083a385f2cSJames Collins 'values' => ['admin', 'always', 'none'] 3093a385f2cSJames Collins ], 3103a385f2cSJames Collins ['keys' => ['licenseType'], 'type' => 'choice', 3113a385f2cSJames Collins 'values' => ['badge', 'button', 'none'] 3123a385f2cSJames Collins ], 3133a385f2cSJames Collins ['keys' => ['navbarUseTitleIcon'], 'type' => 'bool'], 3143a385f2cSJames Collins ['keys' => ['navbarUseTitleText'], 'type' => 'bool'], 3153a385f2cSJames Collins ['keys' => ['navbarUseTaglineText'], 'type' => 'bool'], 3163a385f2cSJames Collins ['keys' => ['navbarShowSub'], 'type' => 'bool'], 3173a385f2cSJames Collins ['keys' => ['heroTitle'], 'type' => 'bool'], 3183a385f2cSJames Collins ['keys' => ['heroImagePropagation'], 'type' => 'bool'], 3193a385f2cSJames Collins ['keys' => ['breadcrumbPrefix'], 'type' => 'bool'], 3203a385f2cSJames Collins ['keys' => ['breadcrumbSep'], 'type' => 'bool'], 3213a385f2cSJames Collins ['keys' => ['youareherePrefix'], 'type' => 'bool'], 3223a385f2cSJames Collins ['keys' => ['youarehereSep'], 'type' => 'bool'], 3233a385f2cSJames Collins ['keys' => ['sidebarShowLeft'], 'type' => 'bool'], 3243a385f2cSJames Collins ['keys' => ['sidebarShowRight'], 'type' => 'bool'], 3253a385f2cSJames Collins ['keys' => ['tocFull'], 'type' => 'bool'], 3263a385f2cSJames Collins ['keys' => ['footerSearch'], 'type' => 'bool'], 3273a385f2cSJames Collins ['keys' => ['licenseImageOnly'], 'type' => 'bool'], 3283a385f2cSJames Collins ['keys' => ['includePageUseACL'], 'type' => 'bool'], 3293a385f2cSJames Collins ['keys' => ['includePagePropagate'], 'type' => 'bool'], 3303a385f2cSJames Collins ['keys' => ['youarehereHideHome'], 'type' => 'bool'], 3313a385f2cSJames Collins ['keys' => ['tagsConsolidate'], 'type' => 'bool'], 3323a385f2cSJames Collins ['keys' => ['footerInPage'], 'type' => 'bool'], 3333a385f2cSJames Collins ['keys' => ['sidebarMobileDefaultCollapse'], 'type' => 'bool'], 3343a385f2cSJames Collins ['keys' => ['sidebarAlwaysShowLeft'], 'type' => 'bool'], 3353a385f2cSJames Collins ['keys' => ['sidebarAlwaysShowRight'], 'type' => 'bool'], 3363a385f2cSJames Collins ['keys' => ['searchUseTypeahead'], 'type' => 'bool'], 33712030b10SJames Collins ['keys' => ['showLightDark'], 'type' => 'bool'], 33834d5f19aSJames Collins ['keys' => ['autoLightDark'], 'type' => 'bool'], 3393a385f2cSJames Collins ['keys' => ['youarehereShowLast'], 'type' => 'int'], 3403a385f2cSJames Collins 3413a385f2cSJames Collins ['keys' => ['iconTag'], 'type' => 'string'], 3423a385f2cSJames Collins ['keys' => ['customTheme'], 'type' => 'string'], 3433a385f2cSJames Collins ['keys' => ['navbarCustomMenuText'], 'type' => 'string'], 3443a385f2cSJames Collins ['keys' => ['breadcrumbPrefixText'], 'type' => 'string'], 3453a385f2cSJames Collins ['keys' => ['breadcrumbSepText'], 'type' => 'string'], 3463a385f2cSJames Collins ['keys' => ['youareherePrefixText'], 'type' => 'string'], 3473a385f2cSJames Collins ['keys' => ['youarehereSepText'], 'type' => 'string'], 348*daf2cd7aSJames Collins ['keys' => ['footerPageInfoText'], 'type' => 'string'], 3493a385f2cSJames Collins ['keys' => ['footerCustomMenuText'], 'type' => 'string'], 3503a385f2cSJames Collins ['keys' => ['brandURLGuest'], 'type' => 'string'], 3513a385f2cSJames Collins ['keys' => ['brandURLUser'], 'type' => 'string'], 3523a385f2cSJames Collins 3533a385f2cSJames Collins ['keys' => ['useLESS'], 'type' => 'less'], 3543a385f2cSJames Collins ]; 3553a385f2cSJames Collins 3563a385f2cSJames Collins foreach ($data as $row) { 3573a385f2cSJames Collins // does not check case.... 3583a385f2cSJames Collins if (in_array($key, $row['keys']) === true) { 35995372bffSJames Collins if (array_key_exists('type', $row) === true) { 3603a385f2cSJames Collins switch ($row['type']) { 3613a385f2cSJames Collins case 'bool': 3623a385f2cSJames Collins return (bool) $value; 3633a385f2cSJames Collins case 'int': 3643a385f2cSJames Collins return (int) $value; 3653a385f2cSJames Collins case 'string': 3663a385f2cSJames Collins return $value; 3673a385f2cSJames Collins case 'less': 36829118ed7SJames Collins $value = (bool) $value; 369a8df40efSJames Collins $lessAvailable = false; 370c963c68cSJames Collins 371c963c68cSJames Collins // search for less library 372c963c68cSJames Collins $path = '/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 373c963c68cSJames Collins if (($lessAvailable = file_exists('.' . $path)) !== true) { 374c963c68cSJames Collins for ($i = 0; $i < 6; $i++) { 375c963c68cSJames Collins if (($lessAvailable = file_exists($_SERVER['DOCUMENT_ROOT'] . $path)) === true) { 376c963c68cSJames Collins break; 377a8df40efSJames Collins } 378a8df40efSJames Collins 379c963c68cSJames Collins $path = '/..' . $path; 380c963c68cSJames Collins } 381c963c68cSJames Collins 382c963c68cSJames Collins if ($lessAvailable !== true) { 383c963c68cSJames Collins $path = '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 384c963c68cSJames Collins for ($i = 0; $i < 6; $i++) { 38554915114SJames Collins if ( 38654915114SJames Collins ($lessAvailable = file_exists( 38754915114SJames Collins $_SERVER['DOCUMENT_ROOT'] . $path 38854915114SJames Collins )) === true 38954915114SJames Collins ) { 390c963c68cSJames Collins break; 391c963c68cSJames Collins } 392c963c68cSJames Collins 393c963c68cSJames Collins $path = '/..' . $path; 394c963c68cSJames Collins } 395c963c68cSJames Collins } 396c963c68cSJames Collins }//end if 397c963c68cSJames Collins 398a8df40efSJames Collins // check for ctype extensions 3999cff245bSJames Collins if (function_exists('ctype_digit') === false) { 400a8df40efSJames Collins $lessAvailable = false; 401a8df40efSJames Collins } 402a8df40efSJames Collins 4039cff245bSJames Collins if ($value === true && $lessAvailable === false) { 404a8df40efSJames Collins $this->lessIgnored = true; 40529118ed7SJames Collins $value = false; 40629118ed7SJames Collins } 4073a385f2cSJames Collins 4083a385f2cSJames Collins return $value; 4099cff245bSJames Collins }//end switch 4103a385f2cSJames Collins }//end if 4113a385f2cSJames Collins 4123a385f2cSJames Collins if (in_array($value, $row['values']) === true) { 4133a385f2cSJames Collins return $value; 4143a385f2cSJames Collins } 4153a385f2cSJames Collins 4163a385f2cSJames Collins if (array_key_exists('default', $row) === true) { 4173a385f2cSJames Collins if (is_array($row['default']) === true) { 4183a385f2cSJames Collins if (array_key_exists($key, $row['default']) === true) { 4193a385f2cSJames Collins return $row['default'][$key]; 4203a385f2cSJames Collins } 4213a385f2cSJames Collins } else { 4223a385f2cSJames Collins return $row['default']; 4233a385f2cSJames Collins } 4243a385f2cSJames Collins } 4253a385f2cSJames Collins 4263a385f2cSJames Collins return reset($row['values']); 4273a385f2cSJames Collins }//end if 4283a385f2cSJames Collins }//end foreach 429c165b184SJames Collins 430c165b184SJames Collins return $value; 431c165b184SJames Collins } 432c165b184SJames Collins 433c165b184SJames Collins 43495372bffSJames Collins // phpcs:enable 43595372bffSJames Collins 43695372bffSJames Collins 437c165b184SJames Collins /** 438a8eebd82SJames Collins * Check if a page exist in directory or namespace 439c165b184SJames Collins * 4409cff245bSJames Collins * @param string $page Page/namespace to search. 441a8eebd82SJames Collins * @return boolean if page exists 442c165b184SJames Collins */ 4439cff245bSJames Collins public function pageExists(string $page) 44410b40067Snomadjimbob { 445ab45ba71SJames Collins ob_start(); 446a8eebd82SJames Collins tpl_includeFile($page . '.html'); 447ab45ba71SJames Collins $html = ob_get_contents(); 448ab45ba71SJames Collins ob_end_clean(); 449a8eebd82SJames Collins 4503a385f2cSJames Collins if (empty($html) === false) { 4519cff245bSJames Collins return true; 4529cff245bSJames Collins } 453a8eebd82SJames Collins 454a8eebd82SJames Collins $useACL = $this->getConf('includePageUseACL'); 455a8eebd82SJames Collins $propagate = $this->getConf('includePagePropagate'); 456a8eebd82SJames Collins 4579cff245bSJames Collins if ($propagate === true) { 4589cff245bSJames Collins if (page_findnearest($page, $useACL) !== false) { 4599cff245bSJames Collins return true; 4609cff245bSJames Collins } 4619cff245bSJames Collins } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) { 4629cff245bSJames Collins return true; 463ab45ba71SJames Collins } 464ab45ba71SJames Collins 4659cff245bSJames Collins return false; 466ab45ba71SJames Collins } 467ab45ba71SJames Collins 468a8eebd82SJames Collins 469c165b184SJames Collins /** 470a8eebd82SJames Collins * Print or return page from directory or namespace 4712b4583abSJames Collins * 4729cff245bSJames Collins * @param string $page Page/namespace to include. 4739cff245bSJames Collins * @param boolean $print Print content. 4749cff245bSJames Collins * @param boolean $parse Parse content before printing/returning. 4759cff245bSJames Collins * @param string $classWrapper Wrap page in a div with class. 476ab45ba71SJames Collins * @return string contents of page found 4772b4583abSJames Collins */ 4789cff245bSJames Collins public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '') 4792b4583abSJames Collins { 480a8eebd82SJames Collins ob_start(); 481a8eebd82SJames Collins tpl_includeFile($page . '.html'); 482a8eebd82SJames Collins $html = ob_get_contents(); 483a8eebd82SJames Collins ob_end_clean(); 484a8eebd82SJames Collins 4853a385f2cSJames Collins if (empty($html) === true) { 4864f8225e4SJames Collins global $MSG; 4874f8225e4SJames Collins 488a8eebd82SJames Collins $useACL = $this->getConf('includePageUseACL'); 489a8eebd82SJames Collins $propagate = $this->getConf('includePagePropagate'); 490ab45ba71SJames Collins $html = ''; 4912b4583abSJames Collins 4924f8225e4SJames Collins ob_start(); 493ab45ba71SJames Collins $html = tpl_include_page($page, false, $propagate, $useACL); 4944f8225e4SJames Collins $this->includedPageNotifications .= ob_get_contents(); 4954f8225e4SJames Collins ob_end_clean(); 496ab45ba71SJames Collins } 4972b4583abSJames Collins 4983a385f2cSJames Collins if (empty($html) === false && $parse === true) { 499ab45ba71SJames Collins $html = $this->parseContent($html); 500ab45ba71SJames Collins } 5012b4583abSJames Collins 5023a385f2cSJames Collins if (empty($classWrapper) === false && empty($html) === false) { 5039cff245bSJames Collins $html = '<div class="' . $classWrapper . '">' . $html . '</div>'; 5049cff245bSJames Collins } 5052b4583abSJames Collins 5069cff245bSJames Collins if ($print === true) { 5079cff245bSJames Collins echo $html; 5089cff245bSJames Collins } 509ab45ba71SJames Collins return $html; 5102b4583abSJames Collins } 5112b4583abSJames Collins 512a8eebd82SJames Collins 513a8eebd82SJames Collins /** 514a8eebd82SJames Collins * Print or return logged in user information 515a8eebd82SJames Collins * 5169cff245bSJames Collins * @param boolean $print Print content. 517a8eebd82SJames Collins * @return string user information 518a8eebd82SJames Collins */ 5199cff245bSJames Collins public function includeLoggedIn(bool $print = true) 52010b40067Snomadjimbob { 521a8eebd82SJames Collins $html = ''; 522a8eebd82SJames Collins 5239cff245bSJames Collins if (empty($_SERVER['REMOTE_USER']) === false) { 524a8eebd82SJames Collins $html .= '<div class="mikio-user-info">'; 525a8eebd82SJames Collins ob_start(); 526a8eebd82SJames Collins tpl_userinfo(); 527a8eebd82SJames Collins $html .= ob_get_contents(); 528a8eebd82SJames Collins ob_end_clean(); 529a8eebd82SJames Collins $html .= '</div>'; 5302b4583abSJames Collins } 531a8eebd82SJames Collins 5329cff245bSJames Collins if ($print === true) { 5339cff245bSJames Collins echo $html; 5349cff245bSJames Collins } 535a8eebd82SJames Collins return $html; 5362b4583abSJames Collins } 5372b4583abSJames Collins 5382b4583abSJames Collins 539a8eebd82SJames Collins /** 540a8eebd82SJames Collins * Print or return DokuWiki Menu 541a8eebd82SJames Collins * 5429cff245bSJames Collins * @param boolean $print Print content. 543a8eebd82SJames Collins * @return string contents of the menu 544a8eebd82SJames Collins */ 5459cff245bSJames Collins public function includeDWMenu(bool $print = true) 54610b40067Snomadjimbob { 5472b4583abSJames Collins global $lang; 5482b4583abSJames Collins global $USERINFO; 549c165b184SJames Collins 5509cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 551a8eebd82SJames Collins $html = '<ul class="mikio-nav">'; 5522b4583abSJames Collins 553ab45ba71SJames Collins $pageToolsMenu = []; 554ab45ba71SJames Collins $siteToolsMenu = []; 555ab45ba71SJames Collins $userToolsMenu = []; 556c165b184SJames Collins 557ab45ba71SJames Collins $showIcons = ($this->getConf('navbarDWMenuType') != 'text'); 558ab45ba71SJames Collins $showText = ($this->getConf('navbarDWMenuType') != 'icons'); 559ab45ba71SJames Collins $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate'); 5602b4583abSJames Collins 5612b4583abSJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 5622b4583abSJames Collins foreach ($items as $item) { 5639cff245bSJames Collins if ($item->getType() !== 'top') { 564ab45ba71SJames Collins $itemHtml = ''; 5652b4583abSJames Collins 566905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5679cff245bSJames Collins if ( 5683a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 5693a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 5703a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5719cff245bSJames Collins ) { 5729cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . 5739cff245bSJames Collins ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 5749cff245bSJames Collins if ($showIcons === true) { 5759cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 5769cff245bSJames Collins } 5779cff245bSJames Collins if ($showText === true || $isDropDown === true) { 5789cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 5799cff245bSJames Collins } 580ab45ba71SJames Collins $itemHtml .= '</a>'; 581ab45ba71SJames Collins 582ab45ba71SJames Collins $pageToolsMenu[] = $itemHtml; 5832b4583abSJames Collins } 5849cff245bSJames Collins }//end if 5859cff245bSJames Collins }//end foreach 5862b4583abSJames Collins 587ab45ba71SJames Collins $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action'); 588ab45ba71SJames Collins foreach ($items as $item) { 589ab45ba71SJames Collins $itemHtml = ''; 5902b4583abSJames Collins 591905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5929cff245bSJames Collins if ( 5933a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 5943a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 5953a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5969cff245bSJames Collins ) { 5979cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' . 5989cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 5999cff245bSJames Collins if ($showIcons === true) { 6009cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 6019cff245bSJames Collins } 6029cff245bSJames Collins if ($showText === true || $isDropDown === true) { 6039cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 6049cff245bSJames Collins } 605ab45ba71SJames Collins $itemHtml .= '</a>'; 6062b4583abSJames Collins 607ab45ba71SJames Collins $siteToolsMenu[] = $itemHtml; 6082b4583abSJames Collins } 6099cff245bSJames 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())); 6169cff245bSJames Collins if ( 6173a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 6183a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 6193a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 6209cff245bSJames Collins ) { 6219cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' . 6229cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 6239cff245bSJames Collins if ($showIcons === true) { 6249cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 6259cff245bSJames Collins } 6269cff245bSJames Collins if ($showText === true || $isDropDown === true) { 6279cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 6289cff245bSJames Collins } 629ab45ba71SJames Collins $itemHtml .= '</a>'; 630ab45ba71SJames Collins 631ab45ba71SJames Collins $userToolsMenu[] = $itemHtml; 632ab45ba71SJames Collins } 6339cff245bSJames Collins }//end foreach 634ab45ba71SJames Collins 635ab45ba71SJames Collins 636ab45ba71SJames Collins switch ($this->getConf('navbarDWMenuCombine')) { 637ab45ba71SJames Collins case 'dropdown': 638ab45ba71SJames Collins $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">'; 6399cff245bSJames Collins $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button" 6409cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6419cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('file') : '') . 6429cff245bSJames Collins ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] . 6439cff245bSJames Collins '</span>') . '</a>'; 644a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 645ab45ba71SJames Collins 646ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 647ab45ba71SJames Collins $html .= $item; 648ab45ba71SJames Collins } 649ab45ba71SJames Collins 650ab45ba71SJames Collins $html .= '</div>'; 651ab45ba71SJames Collins $html .= '</li>'; 652ab45ba71SJames Collins 653a8eebd82SJames Collins $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">'; 6549cff245bSJames Collins $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button" 6559cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6569cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('gear') : '') . 6579cff245bSJames Collins ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' . 6589cff245bSJames Collins $lang['site_tools'] . '</span>') . '</a>'; 659a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 660ab45ba71SJames Collins 661ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 662ab45ba71SJames Collins $html .= $item; 663ab45ba71SJames Collins } 664ab45ba71SJames Collins 665ab45ba71SJames Collins $html .= '</div>'; 666ab45ba71SJames Collins $html .= '</li>'; 667ab45ba71SJames Collins 668a8eebd82SJames Collins $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">'; 6699cff245bSJames Collins $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button" 6709cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6719cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('user') : '') . 6729cff245bSJames Collins ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' . 6739cff245bSJames Collins $lang['user_tools'] . '</span>') . '</a>'; 674a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 675ab45ba71SJames Collins 676ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 677ab45ba71SJames Collins $html .= $item; 678ab45ba71SJames Collins } 679ab45ba71SJames Collins 680ab45ba71SJames Collins $html .= '</div>'; 681ab45ba71SJames Collins $html .= '</li>'; 682ab45ba71SJames Collins 683ab45ba71SJames Collins break; 684ab45ba71SJames Collins 685ab45ba71SJames Collins case 'combine': 686ab45ba71SJames Collins $html .= '<li class="mikio-nav-dropdown">'; 6879cff245bSJames Collins $html .= '<a class="mikio-nav-link" href="#">' . 6889cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') . 6899cff245bSJames Collins ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' . 6909cff245bSJames Collins tpl_getLang('tools-menu') . '</span>') . '</a>'; 691a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 692ab45ba71SJames Collins 693ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>'; 694ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 695ab45ba71SJames Collins $html .= $item; 696ab45ba71SJames Collins } 697ab45ba71SJames Collins 698ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 699ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>'; 700ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 701ab45ba71SJames Collins $html .= $item; 702ab45ba71SJames Collins } 703ab45ba71SJames Collins 704ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 705ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>'; 706ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 707ab45ba71SJames Collins $html .= $item; 708ab45ba71SJames Collins } 709ab45ba71SJames Collins 710ab45ba71SJames Collins $html .= '</div>'; 711ab45ba71SJames Collins $html .= '</li>'; 712ab45ba71SJames Collins break; 713ab45ba71SJames Collins 714ab45ba71SJames Collins default: // seperate 715ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 716a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 717ab45ba71SJames Collins } 718ab45ba71SJames Collins 719ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 720a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 721a8eebd82SJames Collins } 722a8eebd82SJames Collins 723a8eebd82SJames Collins foreach ($userToolsMenu as $item) { 724a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 725ab45ba71SJames Collins } 726ab45ba71SJames Collins 727ab45ba71SJames Collins break; 7289cff245bSJames Collins }//end switch 729ab45ba71SJames Collins 7303a3ece10SJames Collins $translation = plugin_load('helper', 'translation'); 7313a3ece10SJames Collins if ($translation !== null) { 7323a3ece10SJames Collins $html .= '<li id="mikio__translate" class="mikio-nav-dropdown">'; 7333a3ece10SJames Collins $html .= '<a id="mikio_dropdown_translate" class="nav-link dropdown-toggle" href="#" role="button" 7343a3ece10SJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 7353a3ece10SJames Collins $this->mikioInlineIcon('language') . 7363a3ece10SJames Collins '</a>'; 7373a3ece10SJames Collins $html .= '<div class="mikio-dropdown closed">'; 7383a3ece10SJames Collins 7393a3ece10SJames Collins $html .= $translation->showTranslations(); 7403a3ece10SJames Collins 7413a3ece10SJames Collins $html .= '</div>'; 7423a3ece10SJames Collins $html .= '</li>'; 7433a3ece10SJames Collins } 7443a3ece10SJames Collins 74512030b10SJames Collins if ($this->getConf('showLightDark') === true) { 746d0fba6d1SJames Collins $autoLightDark = $this->getConf('autoLightDark'); 7479e41d878SJames Collins $html .= '<li class="mikio-darklight"> 7489e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' . 749d0fba6d1SJames Collins ($autoLightDark === true ? $this->mikioInlineIcon('sunmoon', 'mikio-darklight-auto') : '') . 7509e41d878SJames Collins $this->mikioInlineIcon('sun', 'mikio-darklight-light') . 7519e41d878SJames Collins $this->mikioInlineIcon('moon', 'mikio-darklight-dark') . 7529e41d878SJames Collins '</a></li>'; 75312030b10SJames Collins } 75412030b10SJames Collins 755ab45ba71SJames Collins $html .= '</ul>'; 756ab45ba71SJames Collins 7579cff245bSJames Collins if ($print === true) { 7589cff245bSJames Collins echo $html; 7599cff245bSJames Collins } 760a8eebd82SJames Collins return $html; 761a8eebd82SJames Collins } 762a8eebd82SJames Collins 763a8eebd82SJames Collins 764a8eebd82SJames Collins /** 765a8eebd82SJames Collins * Create a nav element from a string. <uri>|<title>; 766a8eebd82SJames Collins * 7679cff245bSJames Collins * @param string $str String to generate nav. 768a8eebd82SJames Collins * @return string nav elements generated 769a8eebd82SJames Collins */ 7709cff245bSJames Collins public function stringToNav(string $str) 77110b40067Snomadjimbob { 772a8eebd82SJames Collins $html = ''; 773a8eebd82SJames Collins 7743a385f2cSJames Collins if (empty($str) === false) { 775a8eebd82SJames Collins $items = explode(';', $str); 776a8eebd82SJames Collins if (count($items) > 0) { 777a8eebd82SJames Collins $html .= '<ul class="mikio-nav">'; 778a8eebd82SJames Collins foreach ($items as $item) { 779a8eebd82SJames Collins $parts = explode('|', $item); 780a8eebd82SJames Collins if ($parts > 1) { 7819cff245bSJames Collins $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' . 7829cff245bSJames Collins strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) . 7839cff245bSJames Collins '</a></li>'; 784a8eebd82SJames Collins } 785a8eebd82SJames Collins } 786a8eebd82SJames Collins $html .= '</ul>'; 787a8eebd82SJames Collins } 7882b4583abSJames Collins } 7892b4583abSJames Collins 790ab45ba71SJames Collins return $html; 7912b4583abSJames Collins } 7922b4583abSJames Collins 793a8eebd82SJames Collins /** 794ab45ba71SJames Collins * print or return the main navbar 7952b4583abSJames Collins * 7969cff245bSJames Collins * @param boolean $print Print the navbar. 7979cff245bSJames Collins * @param boolean $showSub Include the sub navbar. 798ab45ba71SJames Collins * @return string generated content 7992b4583abSJames Collins */ 8009cff245bSJames Collins public function includeNavbar(bool $print = true, bool $showSub = false) 80110b40067Snomadjimbob { 802b39ad16dSJames Collins global $conf, $USERINFO; 803d3d7d2b7SJames Collins 804d3d7d2b7SJames Collins $homeUrl = wl(); 805d3d7d2b7SJames Collins 8069cff245bSJames Collins if (plugin_isdisabled('showpageafterlogin') === false) { 807d3d7d2b7SJames Collins $p = &plugin_load('action', 'showpageafterlogin'); 8083a385f2cSJames Collins if (empty($p) === false) { 8099cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 810d3d7d2b7SJames Collins $homeUrl = wl($p->getConf('page_after_login')); 811d3d7d2b7SJames Collins } 812d3d7d2b7SJames Collins } 813b39ad16dSJames Collins } else { 8149cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 815b39ad16dSJames Collins $url = $this->getConf('brandURLUser'); 816b39ad16dSJames Collins if (strlen($url) > 0) { 817b39ad16dSJames Collins $homeUrl = $url; 818d3d7d2b7SJames Collins } 819b39ad16dSJames Collins } else { 820b39ad16dSJames Collins $url = $this->getConf('brandURLGuest'); 821b39ad16dSJames Collins if (strlen($url) > 0) { 822b39ad16dSJames Collins $homeUrl = $url; 823b39ad16dSJames Collins } 824b39ad16dSJames Collins } 825b39ad16dSJames Collins } 826d3d7d2b7SJames Collins 827ab45ba71SJames Collins $html = ''; 82847161538SJames Collins 8299cff245bSJames Collins $html .= '<nav class="mikio-navbar' . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') . 8309cff245bSJames Collins '">'; 831f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 832d3d7d2b7SJames Collins $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">'; 8339cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) { 834ab45ba71SJames Collins // Brand image 8359cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true) { 8369cff245bSJames Collins $logo = $this->getMediaFile('logo', false); 8379cff245bSJames Collins ; 8383a385f2cSJames Collins if (empty($logo) === false) { 839f0241fc4SJames Collins $width = $this->getConf('navbarTitleIconWidth'); 840f0241fc4SJames Collins $height = $this->getConf('navbarTitleIconHeight'); 841f0241fc4SJames Collins $styles = ''; 842f0241fc4SJames Collins 843f0241fc4SJames Collins if (strlen($width) > 0 || strlen($height) > 0) { 8449cff245bSJames Collins if (ctype_digit($width) === true) { 845f0241fc4SJames Collins $styles .= 'max-width:' . intval($width) . 'px;'; 8469cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) { 847f0241fc4SJames Collins $styles .= 'max-width:' . $width . ';'; 8489cff245bSJames Collins } elseif (strcasecmp($width, 'none') === 0) { 8497a92c19bSJames Collins $styles .= 'max-width:none;'; 850f0241fc4SJames Collins } 851f0241fc4SJames Collins 8529cff245bSJames Collins if (ctype_digit($height) === true) { 853f0241fc4SJames Collins $styles .= 'max-height:' . intval($height) . 'px;'; 8549cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) { 855f0241fc4SJames Collins $styles .= 'max-height:' . $height . ';'; 8569cff245bSJames Collins } elseif (strcasecmp($height, 'none') === 0) { 8577a92c19bSJames Collins $styles .= 'max-height:none;'; 858f0241fc4SJames Collins } 859f0241fc4SJames Collins 860f0241fc4SJames Collins if (strlen($styles) > 0) { 861f0241fc4SJames Collins $styles = ' style="' . $styles . '"'; 862f0241fc4SJames Collins } 8639cff245bSJames Collins }//end if 864f0241fc4SJames Collins 865f0241fc4SJames Collins $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>'; 8669cff245bSJames Collins }//end if 8679cff245bSJames Collins }//end if 868ab45ba71SJames Collins 869ab45ba71SJames Collins // Brand title 8709cff245bSJames Collins if ($this->getConf('navbarUseTitleText') === true) { 871ab45ba71SJames Collins $html .= '<div class="mikio-navbar-brand-title">'; 872a8eebd82SJames Collins $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>'; 8739cff245bSJames Collins if ($this->getConf('navbarUseTaglineText') === true) { 874a8eebd82SJames Collins $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>'; 875ab45ba71SJames Collins } 876ab45ba71SJames Collins $html .= '</div>'; 877ab45ba71SJames Collins } 8789cff245bSJames Collins }//end if 879ab45ba71SJames Collins $html .= '</a>'; 880660b2c71SJames Collins $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>'; 881ab45ba71SJames Collins 882ab45ba71SJames Collins // Menus 883ab45ba71SJames Collins $html .= '<div class="mikio-navbar-collapse">'; 884ab45ba71SJames Collins 8859cff245bSJames Collins $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'), 8869cff245bSJames Collins $this->getConf('navbarPosRight', 'none') 8879cff245bSJames Collins ]; 888a8eebd82SJames Collins foreach ($menus as $menuType) { 889a8eebd82SJames Collins switch ($menuType) { 890a8eebd82SJames Collins case 'custom': 891a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', '')); 892a8eebd82SJames Collins break; 893a8eebd82SJames Collins case 'search': 894ab45ba71SJames Collins $html .= '<div class="mikio-nav-item">'; 895ab45ba71SJames Collins $html .= $this->includeSearch(false); 896ab45ba71SJames Collins $html .= '</div>'; 897a8eebd82SJames Collins break; 898a8eebd82SJames Collins case 'dokuwiki': 8999cff245bSJames Collins $html .= $this->includeDWMenu(false); 900a8eebd82SJames Collins break; 901a8eebd82SJames Collins } 902a8eebd82SJames Collins } 903ab45ba71SJames Collins 904ab45ba71SJames Collins $html .= '</div>'; 905f8039bf2SJames Collins $html .= '</div>'; 906ab45ba71SJames Collins $html .= '</nav>'; 907ab45ba71SJames Collins 908a8eebd82SJames Collins // Sub Navbar 9099cff245bSJames Collins if ($showSub === true) { 9109cff245bSJames Collins $sub = $this->includePage('submenu', false); 9113a385f2cSJames Collins if (empty($sub) === false) { 9129cff245bSJames Collins $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>'; 9139cff245bSJames Collins } 914ab45ba71SJames Collins } 915ab45ba71SJames Collins 9169cff245bSJames Collins if ($print === true) { 9179cff245bSJames Collins echo $html; 9189cff245bSJames Collins } 919ab45ba71SJames Collins return $html; 920ab45ba71SJames Collins } 921ab45ba71SJames Collins 922ab45ba71SJames Collins 923a8eebd82SJames Collins /** 924a8eebd82SJames Collins * Is there a sidebar 925a8eebd82SJames Collins * 9269cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 927a8eebd82SJames Collins * @return boolean if sidebar exists 928a8eebd82SJames Collins */ 9299cff245bSJames Collins public function sidebarExists(string $prefix = '') 93010b40067Snomadjimbob { 931a8eebd82SJames Collins global $conf; 932a8eebd82SJames Collins 9333a385f2cSJames Collins if (strcasecmp($prefix, 'left') === 0) { 9349cff245bSJames Collins $prefix = ''; 9359cff245bSJames Collins } 936a8eebd82SJames Collins 937a8eebd82SJames Collins return $this->pageExists($conf['sidebar' . $prefix]); 938a8eebd82SJames Collins } 939a8eebd82SJames Collins 940a8eebd82SJames Collins 941a8eebd82SJames Collins /** 942ab45ba71SJames Collins * Print or return the sidebar content 943ab45ba71SJames Collins * 9449cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 9459cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 9469cff245bSJames Collins * @param boolean $parse Parse the content. 947ab45ba71SJames Collins * @return string generated content 948ab45ba71SJames Collins */ 9499cff245bSJames Collins public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true) 95010b40067Snomadjimbob { 951ab45ba71SJames Collins global $conf, $ID; 952ab45ba71SJames Collins 953ab45ba71SJames Collins $html = ''; 954ab45ba71SJames Collins $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix)); 955ab45ba71SJames Collins $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix)); 956ab45ba71SJames Collins 9573a385f2cSJames Collins if (empty($confPrefix) === true) { 9589cff245bSJames Collins $confPrefix = 'Left'; 9599cff245bSJames Collins } 9601cdedf28SJames Collins if (strcasecmp($prefix, 'left') === 0) { 9619cff245bSJames Collins $prefix = ''; 9629cff245bSJames Collins } 963ab45ba71SJames Collins 9641cdedf28SJames Collins $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar']; 965ab45ba71SJames Collins 9669cff245bSJames Collins if ( 9679cff245bSJames Collins $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false && 9681cdedf28SJames Collins p_get_metadata($ID, 'nosidebar', false) === null 9699cff245bSJames Collins ) { 9709cff245bSJames Collins $content = $this->includePage($sidebarPage . 'header', false); 9713a385f2cSJames Collins if (empty($content) === false) { 9729cff245bSJames Collins $html .= '<div class="mikio-sidebar-header">' . $content . '</div>'; 9739cff245bSJames Collins } 974ab45ba71SJames Collins 9753a385f2cSJames Collins if (empty($prefix) === true) { 9769cff245bSJames Collins $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'), 9779cff245bSJames Collins $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4') 9789cff245bSJames Collins ]; 979ab45ba71SJames Collins 980a8eebd82SJames Collins foreach ($rows as $row) { 981a8eebd82SJames Collins switch ($row) { 982a8eebd82SJames Collins case 'search': 9839cff245bSJames Collins $html .= $this->includeSearch(false); 984a8eebd82SJames Collins break; 985a8eebd82SJames Collins case 'logged in user': 9869cff245bSJames Collins $html .= $this->includeLoggedIn(false); 987a8eebd82SJames Collins break; 988a8eebd82SJames Collins case 'content': 9899cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 9903a385f2cSJames Collins if (empty($content) === false) { 9919cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 9929cff245bSJames Collins } 993a8eebd82SJames Collins break; 994a8eebd82SJames Collins case 'tags': 995a8eebd82SJames Collins $html .= '<div class="mikio-tags"></div>'; 996a8eebd82SJames Collins } 997a8eebd82SJames Collins } 998a8eebd82SJames Collins } else { 9999cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 10003a385f2cSJames Collins if (empty($content) === false) { 10019cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 10029cff245bSJames Collins } 10039cff245bSJames Collins }//end if 10049cff245bSJames Collins 10059cff245bSJames Collins $content = $this->includePage($sidebarPage . 'footer', false); 10063a385f2cSJames Collins if (empty($content) === false) { 10079cff245bSJames Collins $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>'; 10089cff245bSJames Collins } 10099cff245bSJames Collins }//end if 10109cff245bSJames Collins 10113a385f2cSJames Collins if (empty($html) === true) { 10123a385f2cSJames Collins if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) { 10139cff245bSJames Collins $html = ' '; 10149cff245bSJames Collins } 10159cff245bSJames Collins if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) { 10169cff245bSJames Collins $html = ' '; 10179cff245bSJames Collins } 1018a8eebd82SJames Collins } 1019ab45ba71SJames Collins 10203a385f2cSJames Collins if (empty($html) === false) { 10211cdedf28SJames Collins $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) . 10229cff245bSJames Collins '"><a class="mikio-sidebar-toggle' . 10239cff245bSJames Collins ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' . 10249cff245bSJames Collins tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' . 10259cff245bSJames Collins $html . '</div></aside>'; 1026ab45ba71SJames Collins } 1027ab45ba71SJames Collins 10289cff245bSJames Collins if ($parse === true) { 10299cff245bSJames Collins $html = $this->includeIcons($html); 10303a04a100SJames Collins } 10319cff245bSJames Collins if ($print === true) { 10329cff245bSJames Collins echo $html; 1033ab45ba71SJames Collins } 10344f8225e4SJames Collins 1035ab45ba71SJames Collins return $html; 1036ab45ba71SJames Collins } 1037ab45ba71SJames Collins 1038ab45ba71SJames Collins 1039a8eebd82SJames Collins /** 1040ab45ba71SJames Collins * Print or return the page tools content 1041ab45ba71SJames Collins * 10429cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 10439cff245bSJames Collins * @param boolean $includeId Include the dw__pagetools id in the element. 1044ab45ba71SJames Collins * @return string generated content 1045ab45ba71SJames Collins */ 10469cff245bSJames Collins public function includePageTools(bool $print = true, bool $includeId = false) 104710b40067Snomadjimbob { 10481293ce10SJames Collins global $USERINFO; 10491293ce10SJames Collins 10509cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 1051ab45ba71SJames Collins $html = ''; 1052ab45ba71SJames Collins 10539cff245bSJames Collins $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">'; 1054b9c0582bSJames Collins $html .= '<ul class="tools">'; 1055ab45ba71SJames Collins 1056ab45ba71SJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 1057ab45ba71SJames Collins foreach ($items as $item) { 10589cff245bSJames Collins $classes = []; 10593fd763a0SJames Collins $classes[] = $item->getType(); 10603fd763a0SJames Collins $attr = $item->getLinkAttributes(); 10613fd763a0SJames Collins 10629cff245bSJames Collins if (empty($attr['class']) === false) { 10633fd763a0SJames Collins $classes = array_merge($classes, explode(' ', $attr['class'])); 1064ab45ba71SJames Collins } 1065ab45ba71SJames Collins 10663fd763a0SJames Collins $classes = array_unique($classes); 10673fd763a0SJames Collins 1068f02b8ab5SJames Collins $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()), 'always'); 10699cff245bSJames Collins if ( 10703a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 10713a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 10723a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true)) 10739cff245bSJames Collins ) { 10743fd763a0SJames Collins $html .= '<li class="' . implode(' ', $classes) . '">'; 10759cff245bSJames Collins $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' . 10769cff245bSJames Collins $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) . 10779cff245bSJames Collins '</div><span class="a11y">' . $item->getLabel() . '</span></a>'; 10783fd763a0SJames Collins $html .= '</li>'; 10793fd763a0SJames Collins } 10809cff245bSJames Collins }//end foreach 10813fd763a0SJames Collins 10823fd763a0SJames Collins $html .= '</ul>'; 1083ab45ba71SJames Collins $html .= '</nav>'; 1084ab45ba71SJames Collins 10859cff245bSJames Collins if ($print === true) { 10869cff245bSJames Collins echo $html; 10879cff245bSJames Collins } 1088ab45ba71SJames Collins return $html; 1089ab45ba71SJames Collins } 1090ab45ba71SJames Collins 1091ab45ba71SJames Collins 1092a8eebd82SJames Collins /** 1093a8eebd82SJames Collins * Print or return the search bar 1094a8eebd82SJames Collins * 10959cff245bSJames Collins * @param boolean $print Print content. 1096a8eebd82SJames Collins * @return string contents of the search bar 1097a8eebd82SJames Collins */ 10989cff245bSJames Collins public function includeSearch(bool $print = true) 109910b40067Snomadjimbob { 11009cff245bSJames Collins global $lang, $ID, $ACT, $QUERY; 1101ab45ba71SJames Collins $html = ''; 1102ab45ba71SJames Collins 11039cff245bSJames Collins $html .= '<form class="mikio-search search" action="' . wl() . 11049cff245bSJames Collins '" accept-charset="utf-8" method="get" role="search">'; 1105a8eebd82SJames Collins $html .= '<input type="hidden" name="do" value="search">'; 1106a8eebd82SJames Collins $html .= '<input type="hidden" name="id" value="' . $ID . '">'; 1107c1cb9f15SChris MacMackin $html .= '<input name="q" '; 11089cff245bSJames Collins if ($this->getConf('searchUseTypeahead') === true) { 1109c1cb9f15SChris MacMackin $html .= 'class="search_typeahead" '; 1110c1cb9f15SChris MacMackin } 11119cff245bSJames Collins $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' . 11123a385f2cSJames Collins ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />'; 1113a8eebd82SJames Collins $html .= '<button type="submit" title="' . $lang['btn_search'] . '">'; 11143a385f2cSJames Collins if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) { 1115a8eebd82SJames Collins $html .= $this->mikioInlineIcon('search'); 1116ab45ba71SJames Collins } else { 1117ab45ba71SJames Collins $html .= $lang['btn_search']; 1118ab45ba71SJames Collins } 1119ab45ba71SJames Collins $html .= '</button>'; 1120ab45ba71SJames Collins $html .= '</form>'; 1121ab45ba71SJames Collins 11229cff245bSJames Collins if ($print === true) { 11239cff245bSJames Collins echo $html; 11249cff245bSJames Collins } 1125ab45ba71SJames Collins return $html; 1126ab45ba71SJames Collins } 1127ab45ba71SJames Collins 1128ab45ba71SJames Collins 1129a8eebd82SJames Collins /** 1130a8eebd82SJames Collins * Print or return content 1131a8eebd82SJames Collins * 11329cff245bSJames Collins * @param boolean $print Print content. 1133a8eebd82SJames Collins * @return string contents 1134a8eebd82SJames Collins */ 11359cff245bSJames Collins public function includeContent(bool $print = true) 113610b40067Snomadjimbob { 1137ab45ba71SJames Collins ob_start(); 11389cff245bSJames Collins tpl_content(false); 1139ab45ba71SJames Collins $html = ob_get_contents(); 1140ab45ba71SJames Collins ob_end_clean(); 1141ab45ba71SJames Collins 1142ab45ba71SJames Collins $html = $this->includeIcons($html); 1143ab45ba71SJames Collins $html = $this->parseContent($html); 1144ab45ba71SJames Collins 1145ab45ba71SJames Collins $html .= '<div style="clear:both"></div>'; 1146ab45ba71SJames Collins 11479cff245bSJames Collins if ($this->getConf('heroTitle') === false) { 11489cff245bSJames Collins $html = '<div class="mikio-tags"></div>' . $html; 11499cff245bSJames Collins } 1150a8eebd82SJames Collins 1151a8eebd82SJames Collins $html = '<div class="mikio-article-content">' . $html . '</div>'; 1152a8eebd82SJames Collins 11539cff245bSJames Collins if ($print === true) { 11549cff245bSJames Collins echo $html; 11559cff245bSJames Collins } 1156ab45ba71SJames Collins return $html; 1157ab45ba71SJames Collins } 1158ab45ba71SJames Collins 1159*daf2cd7aSJames Collins private function custom_tpl_pageinfo($ret = false) 1160*daf2cd7aSJames Collins { 1161*daf2cd7aSJames Collins global $conf; 1162*daf2cd7aSJames Collins global $lang; 1163*daf2cd7aSJames Collins global $INFO; 1164*daf2cd7aSJames Collins global $ID; 1165*daf2cd7aSJames Collins 1166*daf2cd7aSJames Collins // return if we are not allowed to view the page 1167*daf2cd7aSJames Collins if (!auth_quickaclcheck($ID)) { 1168*daf2cd7aSJames Collins return false; 1169*daf2cd7aSJames Collins } 1170*daf2cd7aSJames Collins 1171*daf2cd7aSJames Collins if ($INFO['exists']) { 1172*daf2cd7aSJames Collins $file = $INFO['filepath']; 1173*daf2cd7aSJames Collins if (!$conf['fullpath']) { 1174*daf2cd7aSJames Collins if ($INFO['rev']) { 1175*daf2cd7aSJames Collins $file = str_replace($conf['olddir'] . '/', '', $file); 1176*daf2cd7aSJames Collins } else { 1177*daf2cd7aSJames Collins $file = str_replace($conf['datadir'] . '/', '', $file); 1178*daf2cd7aSJames Collins } 1179*daf2cd7aSJames Collins } 1180*daf2cd7aSJames Collins $file = utf8_decodeFN($file); 1181*daf2cd7aSJames Collins $date = dformat($INFO['lastmod']); 1182*daf2cd7aSJames Collins 1183*daf2cd7aSJames Collins $string = $this->getConf('footerPageInfoText', ''); 1184*daf2cd7aSJames Collins 1185*daf2cd7aSJames Collins // replace lang items 1186*daf2cd7aSJames Collins $string = preg_replace_callback('/%([^%]+)%/', function ($matches) use ($lang) { 1187*daf2cd7aSJames Collins return isset($lang[$matches[1]]) ? $lang[$matches[1]] : ''; 1188*daf2cd7aSJames Collins }, $string); 1189*daf2cd7aSJames Collins 1190*daf2cd7aSJames Collins $options = [ 1191*daf2cd7aSJames Collins 'file' => '<bdi>' . $file . '</bdi>', 1192*daf2cd7aSJames Collins 'date' => $date, 1193*daf2cd7aSJames Collins 'user' => $INFO['editor'] ? '<bdi>' . editorinfo($INFO['editor']) . '</bdi>' : $lang['external_edit'] 1194*daf2cd7aSJames Collins ]; 1195*daf2cd7aSJames Collins 1196*daf2cd7aSJames Collins if (!empty($_SERVER['REMOTE_USER'])) { 1197*daf2cd7aSJames Collins $options['loggedin'] = true; 1198*daf2cd7aSJames Collins } 1199*daf2cd7aSJames Collins 1200*daf2cd7aSJames Collins if ($INFO['locked']) { 1201*daf2cd7aSJames Collins $options['locked'] = '<bdi>' . editorinfo($INFO['locked']) . '</bdi>'; 1202*daf2cd7aSJames Collins } 1203*daf2cd7aSJames Collins 1204*daf2cd7aSJames Collins $parser = new \ParensParser(); 1205*daf2cd7aSJames Collins $result = $parser->parse($string); 1206*daf2cd7aSJames Collins 1207*daf2cd7aSJames Collins $parserIterate = function ($arr, $func) use ($options) { 1208*daf2cd7aSJames Collins $str = ''; 1209*daf2cd7aSJames Collins 1210*daf2cd7aSJames Collins foreach ($arr as $value) { 1211*daf2cd7aSJames Collins if (is_array($value)) { 1212*daf2cd7aSJames Collins $str .= $func($value, $func); 1213*daf2cd7aSJames Collins } else { 1214*daf2cd7aSJames Collins if (preg_match('/^([a-zA-Z]+)=(.*)/', $value, $matches)) { 1215*daf2cd7aSJames Collins $key = strtolower($matches[1]); // Extract the key (a-zA-Z part) 1216*daf2cd7aSJames Collins 1217*daf2cd7aSJames Collins if (isset($options[$key])) { 1218*daf2cd7aSJames Collins $str .= $matches[2]; 1219*daf2cd7aSJames Collins } else { 1220*daf2cd7aSJames Collins return $str; 1221*daf2cd7aSJames Collins } 1222*daf2cd7aSJames Collins } else { 1223*daf2cd7aSJames Collins $str .= $value; 1224*daf2cd7aSJames Collins } 1225*daf2cd7aSJames Collins } 1226*daf2cd7aSJames Collins }//end foreach 1227*daf2cd7aSJames Collins 1228*daf2cd7aSJames Collins return $str; 1229*daf2cd7aSJames Collins }; 1230*daf2cd7aSJames Collins 1231*daf2cd7aSJames Collins $string = $parserIterate($result, $parserIterate); 1232*daf2cd7aSJames Collins 1233*daf2cd7aSJames Collins $string = preg_replace_callback('/{([^}]+)}/', function ($matches) use ($options) { 1234*daf2cd7aSJames Collins $key = strtolower($matches[1]); 1235*daf2cd7aSJames Collins return isset($options[$key]) ? $options[$key] : ''; 1236*daf2cd7aSJames Collins }, $string); 1237*daf2cd7aSJames Collins 1238*daf2cd7aSJames Collins if ($ret) { 1239*daf2cd7aSJames Collins return $string; 1240*daf2cd7aSJames Collins } else { 1241*daf2cd7aSJames Collins echo $string; 1242*daf2cd7aSJames Collins return true; 1243*daf2cd7aSJames Collins } 1244*daf2cd7aSJames Collins }//end if 1245*daf2cd7aSJames Collins 1246*daf2cd7aSJames Collins return false; 1247*daf2cd7aSJames Collins } 1248*daf2cd7aSJames Collins 1249a8eebd82SJames Collins /** 1250ab45ba71SJames Collins * Print or return footer 1251ab45ba71SJames Collins * 12529cff245bSJames Collins * @param boolean $print Print footer. 12539cff245bSJames Collins * @return string HTML string containing footer 1254ab45ba71SJames Collins */ 12559cff245bSJames Collins public function includeFooter(bool $print = true) 125610b40067Snomadjimbob { 1257ab45ba71SJames Collins global $ACT; 1258ab45ba71SJames Collins 1259ab45ba71SJames Collins $html = ''; 1260ab45ba71SJames Collins 1261ab45ba71SJames Collins $html .= '<footer class="mikio-footer">'; 1262*daf2cd7aSJames Collins $html .= '<div class="doc">' . $this->custom_tpl_pageinfo(true) . '</div>'; 12639cff245bSJames Collins $html .= $this->includePage('footer', false); 1264ab45ba71SJames Collins 1265a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('footerCustomMenuText')); 1266ab45ba71SJames Collins 12679cff245bSJames Collins if ($this->getConf('footerSearch') === true) { 1268ab45ba71SJames Collins $html .= '<div class="mikio-footer-search">'; 12699cff245bSJames Collins $html .= $this->includeSearch(false); 1270ab45ba71SJames Collins $html .= '</div>'; 1271ab45ba71SJames Collins } 1272ab45ba71SJames Collins 1273a8eebd82SJames Collins $showPageTools = $this->getConf('pageToolsFooter'); 12749cff245bSJames Collins if ( 12753a385f2cSJames Collins strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 || 12763a385f2cSJames Collins $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0) 12779cff245bSJames Collins ) { 12789cff245bSJames Collins $html .= $this->includePageTools(false); 12799cff245bSJames Collins } 1280ab45ba71SJames Collins 12819cff245bSJames Collins $meta['licenseType'] = ['multichoice', '_choices' => ['none', 'badge', 'button']]; 12829cff245bSJames Collins $meta['licenseImageOnly'] = ['onoff']; 1283ab45ba71SJames Collins 1284ab45ba71SJames Collins $licenseType = $this->getConf('licenseType'); 12859cff245bSJames Collins if ($licenseType !== 'none') { 12869cff245bSJames Collins $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true); 1287ab45ba71SJames Collins } 1288ab45ba71SJames Collins 1289ab45ba71SJames Collins $html .= '</footer>'; 1290ab45ba71SJames Collins 12919cff245bSJames Collins if ($print === true) { 12929cff245bSJames Collins echo $html; 12939cff245bSJames Collins } 1294ab45ba71SJames Collins return $html; 1295ab45ba71SJames Collins } 1296ab45ba71SJames Collins 1297ab45ba71SJames Collins 1298a8eebd82SJames Collins /** 1299ab45ba71SJames Collins * Print or return breadcrumb trail 1300ab45ba71SJames Collins * 13019cff245bSJames Collins * @param boolean $print Print out trail. 13029cff245bSJames Collins * @param boolean $parse Parse trail before printing. 13039cff245bSJames Collins * @return string HTML string containing breadcrumbs 1304ab45ba71SJames Collins */ 13059cff245bSJames Collins public function includeBreadcrumbs(bool $print = true, bool $parse = true) 130610b40067Snomadjimbob { 1307a8eebd82SJames Collins global $conf, $ID, $lang, $ACT; 1308a8eebd82SJames Collins 13093a385f2cSJames Collins if ( 13103a385f2cSJames Collins $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 && 131195372bffSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0 13123a385f2cSJames Collins ) { 13139cff245bSJames Collins return ''; 13149cff245bSJames Collins } 1315ab45ba71SJames Collins 1316ab45ba71SJames Collins $html = '<div class="mikio-breadcrumbs">'; 1317f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 13183a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 131995372bffSJames Collins if ($conf['breadcrumbs'] !== 0) { 13209cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) { 1321ab45ba71SJames Collins ob_start(); 132275adba86SJames Collins tpl_breadcrumbs(); 1323ab45ba71SJames Collins $html .= ob_get_contents(); 1324ab45ba71SJames Collins ob_end_clean(); 1325ab45ba71SJames Collins } else { 1326ab45ba71SJames Collins $sep = '•'; 1327ab45ba71SJames Collins $prefix = $lang['breadcrumb']; 1328ab45ba71SJames Collins 13299cff245bSJames Collins if ($this->getConf('breadcrumbSep') === true) { 1330ab45ba71SJames Collins $sep = $this->getConf('breadcrumbSepText'); 13319cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-sep', false); 1332ab45ba71SJames Collins 13339cff245bSJames Collins if ($img !== false) { 1334ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1335ab45ba71SJames Collins } 133647161538SJames Collins } 133747161538SJames Collins 13389cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === true) { 1339ab45ba71SJames Collins $prefix = $this->getConf('breadcrumbPrefixText'); 13409cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-prefix', false); 1341ab45ba71SJames Collins 13429cff245bSJames Collins if ($img !== false) { 1343ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 1344ab45ba71SJames Collins } 1345ab45ba71SJames Collins } 1346ab45ba71SJames Collins 1347ab45ba71SJames Collins $crumbs = breadcrumbs(); 1348ab45ba71SJames Collins 1349ab45ba71SJames Collins $html .= '<ul>'; 13503a385f2cSJames Collins if (empty($prefix) === false) { 13519cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 13529cff245bSJames Collins } 1353ab45ba71SJames Collins 1354ab45ba71SJames Collins $last = count($crumbs); 1355ab45ba71SJames Collins $i = 0; 1356ab45ba71SJames Collins foreach ($crumbs as $id => $name) { 1357ab45ba71SJames Collins $i++; 135895372bffSJames Collins if ($i !== 1) { 1359ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 136095372bffSJames Collins } 13619cff245bSJames Collins $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>'; 13629cff245bSJames Collins $html .= tpl_pagelink($id, null, true); 1363ab45ba71SJames Collins $html .= '</li>'; 1364ab45ba71SJames Collins } 1365ab45ba71SJames Collins 1366ab45ba71SJames Collins $html .= '</ul>'; 13679cff245bSJames Collins }//end if 13689cff245bSJames Collins }//end if 13699cff245bSJames Collins }//end if 13703d11a778SJames Collins 13713d11a778SJames Collins $html .= '</div>'; 13723d11a778SJames Collins $html .= '</div>'; 13733d11a778SJames Collins 13749cff245bSJames Collins if ($parse === true) { 13759cff245bSJames Collins $html = $this->includeIcons($html); 13769cff245bSJames Collins } 13779cff245bSJames Collins if ($print === true) { 13789cff245bSJames Collins echo $html; 13799cff245bSJames Collins } 13803d11a778SJames Collins return $html; 13813d11a778SJames Collins } 13823d11a778SJames Collins 13833d11a778SJames Collins /** 13843d11a778SJames Collins * Print or return you are here trail 13853d11a778SJames Collins * 13869cff245bSJames Collins * @param boolean $print Print out trail. 13879cff245bSJames Collins * @param boolean $parse Parse trail before printing. 13889cff245bSJames Collins * @return string HTML string containing breadcrumbs 13893d11a778SJames Collins */ 13909cff245bSJames Collins public function includeYouAreHere(bool $print = true, bool $parse = true) 13913d11a778SJames Collins { 13923d11a778SJames Collins global $conf, $ID, $lang, $ACT; 13933d11a778SJames Collins 13943a385f2cSJames Collins if ( 13953a385f2cSJames Collins $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 && 139695372bffSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0 13973a385f2cSJames Collins ) { 13989cff245bSJames Collins return ''; 13999cff245bSJames Collins } 14003d11a778SJames Collins 14013d11a778SJames Collins $html = '<div class="mikio-youarehere">'; 14023d11a778SJames Collins $html .= '<div class="mikio-container">'; 14033a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 140495372bffSJames Collins if ($conf['youarehere'] !== 0) { 14059cff245bSJames Collins if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) { 140695372bffSJames Collins $html .= '<div class="mikio-bcdw">'; 1407ab45ba71SJames Collins ob_start(); 140875adba86SJames Collins tpl_youarehere(); 1409ab45ba71SJames Collins $html .= ob_get_contents(); 1410ab45ba71SJames Collins ob_end_clean(); 141195372bffSJames Collins $html .= '</div>'; 1412ab45ba71SJames Collins } else { 1413ab45ba71SJames Collins $sep = ' » '; 1414ab45ba71SJames Collins $prefix = $lang['youarehere']; 1415ab45ba71SJames Collins 14169cff245bSJames Collins if ($this->getConf('youarehereSep') === true) { 14173d11a778SJames Collins $sep = $this->getConf('youarehereSepText'); 14189cff245bSJames Collins $img = $this->getMediaFile('youarehere-sep', false); 1419ab45ba71SJames Collins 14209cff245bSJames Collins if ($img !== false) { 1421ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1422ab45ba71SJames Collins } 142375adba86SJames Collins } 142475adba86SJames Collins 14259cff245bSJames Collins if ($this->getConf('youareherePrefix') === true) { 14263d11a778SJames Collins $prefix = $this->getConf('youareherePrefixText'); 14279cff245bSJames Collins $img = $this->getMediaFile('youarehere-prefix', false); 1428ab45ba71SJames Collins 14299cff245bSJames Collins if ($img !== false) { 1430ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 143175adba86SJames Collins } 143247161538SJames Collins } 143347161538SJames Collins 1434ab45ba71SJames Collins $html .= '<ul>'; 14353a385f2cSJames Collins if (empty($prefix) === false) { 14369cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 14379cff245bSJames Collins } 14389cff245bSJames Collins $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>'; 1439ab45ba71SJames Collins 1440ab45ba71SJames Collins $parts = explode(':', $ID); 1441ab45ba71SJames Collins $count = count($parts); 1442ab45ba71SJames Collins 1443ab45ba71SJames Collins $part = ''; 14449cff245bSJames Collins for ($i = 0; $i < ($count - 1); $i++) { 1445ab45ba71SJames Collins $part .= $parts[$i] . ':'; 1446ab45ba71SJames Collins $page = $part; 14479cff245bSJames Collins if ($page === $conf['start']) { 14489cff245bSJames Collins continue; 14499cff245bSJames Collins } 1450ab45ba71SJames Collins 1451ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 14529cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1453ab45ba71SJames Collins } 1454ab45ba71SJames Collins 1455ab45ba71SJames Collins resolve_pageid('', $page, $exists); 14569cff245bSJames Collins if ((isset($page) === true && $page === $part . $parts[$i]) === false) { 1457ab45ba71SJames Collins $page = $part . $parts[$i]; 14589cff245bSJames Collins if ($page !== $conf['start']) { 1459ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 14609cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1461ab45ba71SJames Collins } 1462ab45ba71SJames Collins } 1463ab45ba71SJames Collins 1464ab45ba71SJames Collins $html .= '</ul>'; 14659cff245bSJames Collins }//end if 14669cff245bSJames Collins }//end if 1467ab45ba71SJames Collins 14683d11a778SJames Collins $showLast = $this->getConf('youarehereShowLast'); 14699cff245bSJames Collins if ($showLast !== 0) { 1470a8eebd82SJames Collins preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches); 14719cff245bSJames Collins if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) { 1472a8eebd82SJames Collins $count = count($matches[0]); 1473a8eebd82SJames Collins $list = ''; 1474a8eebd82SJames Collins 1475a8eebd82SJames Collins // Show Home 1476a8eebd82SJames Collins $list .= $matches[0][0] . $matches[0][1]; 1477a8eebd82SJames Collins 1478a8eebd82SJames Collins $list .= '<li>...</li>'; 14799cff245bSJames Collins for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) { 1480a8eebd82SJames Collins $list .= $matches[0][$i]; 1481a8eebd82SJames Collins } 1482a8eebd82SJames Collins 1483a8eebd82SJames Collins $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html); 1484a8eebd82SJames Collins } 1485a8eebd82SJames Collins } 1486a8eebd82SJames Collins 14873d11a778SJames Collins switch ($this->getConf('youarehereHome')) { 1488a8eebd82SJames Collins case 'none': 1489a8eebd82SJames Collins $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2); 1490a8eebd82SJames Collins break; 1491a8eebd82SJames Collins case 'home': 1492a8eebd82SJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1); 1493a8eebd82SJames Collins break; 1494a8eebd82SJames Collins case 'icon': 14959cff245bSJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . 14969cff245bSJames Collins $this->mikioInlineIcon('home') . '$3', $html, 1); 1497a8eebd82SJames Collins break; 1498a8eebd82SJames Collins } 1499a8eebd82SJames Collins } else { 1500a8eebd82SJames Collins $html .= '≪ '; 15019cff245bSJames Collins if (isset($_GET['page']) === true) { 15029cff245bSJames Collins $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a> / '; 1503a8eebd82SJames Collins } 15044057121fSJames Collins $html .= '<a href="' . wl($ID) . '">View Page</a>'; 15059cff245bSJames Collins }//end if 15069cff245bSJames Collins 15079cff245bSJames Collins $html .= '</div>'; 15089cff245bSJames Collins $html .= '</div>'; 15099cff245bSJames Collins 15109cff245bSJames Collins if ($parse === true) { 15119cff245bSJames Collins $html = $this->includeIcons($html); 1512a8eebd82SJames Collins } 15139cff245bSJames Collins if ($print === true) { 15149cff245bSJames Collins echo $html; 15159cff245bSJames Collins } 1516ab45ba71SJames Collins return $html; 1517ab45ba71SJames Collins } 1518ab45ba71SJames Collins 15191785fc73SJames Collins /** 15201785fc73SJames Collins * Get Page Title 15219cff245bSJames Collins * 15229cff245bSJames Collins * @return string page title 15231785fc73SJames Collins */ 152410b40067Snomadjimbob public function parsePageTitle() 152510b40067Snomadjimbob { 15262060e56cSJames Collins global $ID; 15272060e56cSJames Collins 15282060e56cSJames Collins $title = p_get_first_heading($ID); 15299cff245bSJames Collins if (strlen($title) <= 0) { 15309cff245bSJames Collins $title = tpl_pagetitle(null, true); 15319cff245bSJames Collins } 15321785fc73SJames Collins $title = $this->includeIcons($title); 15331785fc73SJames Collins 15341785fc73SJames Collins return $title; 15351785fc73SJames Collins } 15361785fc73SJames Collins 1537ab45ba71SJames Collins 153875adba86SJames Collins /** 1539a8eebd82SJames Collins * Print or return hero block 154075adba86SJames Collins * 15419cff245bSJames Collins * @param boolean $print Print content. 1542a8eebd82SJames Collins * @return string contents of hero 154375adba86SJames Collins */ 15449cff245bSJames Collins public function includeHero(bool $print = true) 154510b40067Snomadjimbob { 1546a8eebd82SJames Collins $html = ''; 154747161538SJames Collins 15489cff245bSJames Collins if ($this->getConf('heroTitle') === true) { 1549a8eebd82SJames Collins $html .= '<div class="mikio-hero">'; 1550f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 1551a8eebd82SJames Collins $html .= '<div class="mikio-hero-text">'; 15523a385f2cSJames Collins if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) { 15539cff245bSJames Collins $html .= $this->includeYouAreHere(false); 15549cff245bSJames Collins } 15553a385f2cSJames Collins if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) { 15569cff245bSJames Collins $html .= $this->includeBreadcrumbs(false); 15579cff245bSJames Collins } 1558ab45ba71SJames Collins 1559a8eebd82SJames Collins $html .= '<h1 class="mikio-hero-title">'; 15601785fc73SJames Collins $html .= $this->parsePageTitle(); // No idea why this requires a blank space afterwards to work? 1561a8eebd82SJames Collins $html .= '</h1>'; 1562a8eebd82SJames Collins $html .= '<h2 class="mikio-hero-subtitle"></h2>'; 1563a8eebd82SJames Collins $html .= '</div>'; 156447161538SJames Collins 15659cff245bSJames Collins $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true)); 1566a8eebd82SJames Collins $hero_image_resize_class = ''; 15673a385f2cSJames Collins if (empty($hero_image) === false) { 1568a8eebd82SJames Collins $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"'; 1569a8eebd82SJames Collins $hero_image_resize_class = ' mikio-hero-image-resize'; 157047161538SJames Collins } 1571a8eebd82SJames Collins 15729cff245bSJames Collins $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image . 15739cff245bSJames Collins '><div class="mikio-tags"></div></div>'; 1574a8eebd82SJames Collins 1575a8eebd82SJames Collins $html .= '</div>'; 1576f8039bf2SJames Collins $html .= '</div>'; 15779cff245bSJames Collins }//end if 15789cff245bSJames Collins 15799cff245bSJames Collins if ($print === true) { 15809cff245bSJames Collins echo $html; 158175adba86SJames Collins } 1582a8eebd82SJames Collins 1583a8eebd82SJames Collins return $html; 158475adba86SJames Collins } 158575adba86SJames Collins 158675adba86SJames Collins 158775adba86SJames Collins /** 1588a8eebd82SJames Collins * Print or return out TOC 158975adba86SJames Collins * 15909cff245bSJames Collins * @param boolean $print Print TOC. 15919cff245bSJames Collins * @param boolean $parse Parse icons. 1592a8eebd82SJames Collins * @return string contents of TOC 159375adba86SJames Collins */ 15949cff245bSJames Collins public function includeTOC(bool $print = true, bool $parse = true) 159510b40067Snomadjimbob { 1596ab45ba71SJames Collins $html = ''; 15972b4583abSJames Collins 1598ab45ba71SJames Collins $tocHtml = tpl_toc(true); 1599ab45ba71SJames Collins 16003a385f2cSJames Collins if (empty($tocHtml) === false) { 1601f65a4e5eSJames Collins $tocHtml = preg_replace( 1602f65a4e5eSJames Collins '/(<h3.+?toggle.+?>)(.+?)<\/h3>/', 1603f65a4e5eSJames Collins '$1' . 1604f65a4e5eSJames Collins $this->mikioInlineIcon('hamburger', 'hamburger') . '$2' . 1605f65a4e5eSJames Collins $this->mikioInlineIcon('down-arrow', 'down-arrow') . '</h3>', 1606f65a4e5eSJames Collins $tocHtml 1607f65a4e5eSJames Collins ); 1608ab45ba71SJames Collins $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml); 1609a8eebd82SJames Collins $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml); 1610ab45ba71SJames Collins 1611ab45ba71SJames Collins $html .= '<div class="mikio-toc">'; 1612ab45ba71SJames Collins $html .= $tocHtml; 1613ab45ba71SJames Collins $html .= '</div>'; 16142b4583abSJames Collins } 16152b4583abSJames Collins 16169cff245bSJames Collins if ($parse === true) { 16179cff245bSJames Collins $html = $this->includeIcons($html); 16189cff245bSJames Collins } 16199cff245bSJames Collins 16209cff245bSJames Collins if ($print === true) { 1621ab45ba71SJames Collins echo $html; 1622ab45ba71SJames Collins } 1623ab45ba71SJames Collins 16249cff245bSJames Collins return $html; 16259cff245bSJames Collins } 16269cff245bSJames Collins 1627ab45ba71SJames Collins 1628a8eebd82SJames Collins /** 1629ab45ba71SJames Collins * Parse the string and replace icon elements with included icon libraries 1630ab45ba71SJames Collins * 16319cff245bSJames Collins * @param string $str Content to parse. 1632ab45ba71SJames Collins * @return string parsed string 1633ab45ba71SJames Collins */ 16349cff245bSJames Collins public function includeIcons(string $str) 163510b40067Snomadjimbob { 1636ab45ba71SJames Collins global $ACT, $MIKIO_ICONS; 1637ab45ba71SJames Collins 1638ab45ba71SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 16393a385f2cSJames Collins if (empty($iconTag) === true) { 16409cff245bSJames Collins return $str; 16419cff245bSJames Collins } 1642ab45ba71SJames Collins 16439cff245bSJames Collins if ( 16449cff245bSJames Collins in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true || 16453a385f2cSJames Collins strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0 16469cff245bSJames Collins ) { 1647a2005a27SJames Collins $content = $str; 1648a2005a27SJames Collins $preview = null; 1649a2005a27SJames Collins 16503a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 16519cff245bSJames Collins $html = new \simple_html_dom(); 1652a2005a27SJames Collins $html->stripRNAttrValues = false; 1653a2005a27SJames Collins $html->load($str, true, false); 1654a2005a27SJames Collins 1655a2005a27SJames Collins $preview = $html->find('div.preview'); 16569cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1657a2005a27SJames Collins $content = $preview[0]->innertext; 1658a2005a27SJames Collins } 1659a2005a27SJames Collins } 1660a2005a27SJames Collins 16611785fc73SJames Collins $page_regex = '/(.*)/'; 16629cff245bSJames Collins if (stripos($str, '<pre') !== false) { 16631785fc73SJames Collins $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/'; 16641785fc73SJames Collins } 16651785fc73SJames Collins 16661785fc73SJames Collins $content = preg_replace_callback($page_regex, function ($icons) { 1667a2005a27SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 1668a2005a27SJames Collins 166910b40067Snomadjimbob return preg_replace_callback( 167010b40067Snomadjimbob '/<' . $iconTag . ' ([\w\- #]*)>(?=[^>]*(<|$))/', 1671ab45ba71SJames Collins function ($matches) { 1672ab45ba71SJames Collins global $MIKIO_ICONS; 1673ab45ba71SJames Collins 1674ab45ba71SJames Collins $s = $matches[0]; 1675ab45ba71SJames Collins 1676ab45ba71SJames Collins if (count($MIKIO_ICONS) > 0) { 1677ab45ba71SJames Collins $icon = $MIKIO_ICONS[0]; 1678ab45ba71SJames Collins 1679ab45ba71SJames Collins if (count($matches) > 1) { 1680ab45ba71SJames Collins $e = explode(' ', $matches[1]); 1681ab45ba71SJames Collins 1682ab45ba71SJames Collins if (count($e) > 1) { 1683ab45ba71SJames Collins foreach ($MIKIO_ICONS as $iconItem) { 16849cff245bSJames Collins if (strcasecmp($iconItem['name'], $e[0]) === 0) { 1685ab45ba71SJames Collins $icon = $iconItem; 1686ab45ba71SJames Collins 1687ab45ba71SJames Collins $s = $icon['insert']; 1688ab45ba71SJames Collins for ($i = 1; $i < 9; $i++) { 16891cdedf28SJames Collins if (count($e) < $i || empty($e[$i]) === true) { 16909cff245bSJames Collins if (isset($icon['$' . $i]) === true) { 1691ab45ba71SJames Collins $s = str_replace('$' . $i, $icon['$' . $i], $s); 1692ab45ba71SJames Collins } 1693ab45ba71SJames Collins } else { 1694ab45ba71SJames Collins $s = str_replace('$' . $i, $e[$i], $s); 1695ab45ba71SJames Collins } 1696ab45ba71SJames Collins } 1697ab45ba71SJames Collins 1698ab45ba71SJames Collins $dir = ''; 16999cff245bSJames Collins if (isset($icon['dir']) === true) { 17009cff245bSJames Collins $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/'; 17019cff245bSJames Collins } 1702ab45ba71SJames Collins 1703ab45ba71SJames Collins $s = str_replace('$0', $dir, $s); 1704ab45ba71SJames Collins 1705ab45ba71SJames Collins break; 17069cff245bSJames Collins }//end if 17079cff245bSJames Collins }//end foreach 1708ab45ba71SJames Collins } else { 1709ab45ba71SJames Collins $s = str_replace('$1', $matches[1], $icon['insert']); 17109cff245bSJames Collins }//end if 17119cff245bSJames Collins }//end if 17129cff245bSJames Collins }//end if 171375adba86SJames Collins 1714ab45ba71SJames Collins $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count); 17159cff245bSJames Collins if ($count === 0) { 1716ab45ba71SJames Collins $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s); 1717ab45ba71SJames Collins } 1718ab45ba71SJames Collins 1719ab45ba71SJames Collins return $s; 1720ab45ba71SJames Collins }, 172110b40067Snomadjimbob $icons[0] 172210b40067Snomadjimbob ); 1723a2005a27SJames Collins }, $content); 1724a2005a27SJames Collins 17253a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 17269cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1727a2005a27SJames Collins $preview[0]->innertext = $content; 1728a2005a27SJames Collins } 1729a2005a27SJames Collins 1730a2005a27SJames Collins $str = $html->save(); 1731a2005a27SJames Collins $html->clear(); 1732a2005a27SJames Collins unset($html); 1733a2005a27SJames Collins } else { 1734a2005a27SJames Collins $str = $content; 1735a2005a27SJames Collins } 17369cff245bSJames Collins }//end if 1737ab45ba71SJames Collins 1738ab45ba71SJames Collins return $str; 1739ab45ba71SJames Collins } 174047161538SJames Collins 1741c165b184SJames Collins /** 1742a8eebd82SJames Collins * Parse HTML for theme 1743c165b184SJames Collins * 17449cff245bSJames Collins * @param string $content HTML content to parse. 1745a8eebd82SJames Collins * @return string Parsed content 1746c165b184SJames Collins */ 17479cff245bSJames Collins public function parseContent(string $content) 174810b40067Snomadjimbob { 1749ab45ba71SJames Collins global $INPUT, $ACT; 1750ab45ba71SJames Collins 1751a8eebd82SJames Collins // Add Mikio Section titles 17523a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 17539cff245bSJames Collins $admin_sections = [ 1754ab45ba71SJames Collins // Section Insert Before Icon 17559cff245bSJames Collins 'navbar' => ['navbarUseTitleIcon', ''], 17569cff245bSJames Collins 'search' => ['searchButton', ''], 17579cff245bSJames Collins 'hero' => ['heroTitle', ''], 17589cff245bSJames Collins 'tags' => ['tagsConsolidate', ''], 17599cff245bSJames Collins 'breadcrumb' => ['breadcrumbHideHome', ''], 17609cff245bSJames Collins 'youarehere' => ['youarehereHideHome', ''], 17619cff245bSJames Collins 'sidebar' => ['sidebarShowLeft', ''], 17629cff245bSJames Collins 'toc' => ['tocFull', ''], 17639cff245bSJames Collins 'pagetools' => ['pageToolsFloating', ''], 1764*daf2cd7aSJames Collins 'footer' => ['footerPageInfoText', ''], 17659cff245bSJames Collins 'license' => ['licenseType', ''], 17669cff245bSJames Collins 'acl' => ['includePageUseACL', ''], 17679cff245bSJames Collins 'sticky' => ['stickyTopHeader', ''], 17689cff245bSJames Collins ]; 1769ab45ba71SJames Collins 1770ab45ba71SJames Collins foreach ($admin_sections as $section => $items) { 1771ab45ba71SJames Collins $search = $items[0]; 1772ab45ba71SJames Collins $icon = $items[1]; 1773ab45ba71SJames Collins 177410b40067Snomadjimbob $content = preg_replace( 1775adf52ebbSJames Collins '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/', 17769cff245bSJames Collins '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) . 17779cff245bSJames Collins tpl_getLang('config_' . $section) . 17789cff245bSJames Collins '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' . 17799cff245bSJames Collins $search . '</span>', 178010b40067Snomadjimbob $content 178110b40067Snomadjimbob ); 1782ab45ba71SJames Collins } 1783bb5a3dd1SJames Collins } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) { 1784ad182e6dSnomadjimbob $mikioPluginMissing = true; 1785ad182e6dSnomadjimbob /* Hide plugin fields if not installed */ 17869ffe9161Snomadjimbob if (plugin_load('action', 'mikioplugin') !== null) { 1787ad182e6dSnomadjimbob $mikioPluginMissing = false; 1788ad182e6dSnomadjimbob } 1789ad182e6dSnomadjimbob 1790cee81679SJames Collins $style_headers = [ 1791f65a4e5eSJames Collins ['title' => 'Base', 'starts_with' => '__text_'], 1792f65a4e5eSJames Collins ['title' => 'Code', 'starts_with' => '__code_'], 1793f65a4e5eSJames Collins ['title' => 'Controls', 'starts_with' => '__control_'], 1794f65a4e5eSJames Collins ['title' => 'Header', 'starts_with' => '__topheader_'], 1795f65a4e5eSJames Collins ['title' => 'Navbar', 'starts_with' => '__navbar_'], 1796f65a4e5eSJames Collins ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar_'], 1797f65a4e5eSJames Collins ['title' => 'Tags', 'starts_with' => '__tag_background_color_'], 1798f65a4e5eSJames Collins ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb_'], 1799f65a4e5eSJames Collins ['title' => 'Hero', 'starts_with' => '__hero_'], 1800f65a4e5eSJames Collins ['title' => 'Sidebar', 'starts_with' => '__sidebar_'], 1801f65a4e5eSJames Collins ['title' => 'Content', 'starts_with' => '__content_'], 1802f65a4e5eSJames Collins ['title' => 'TOC', 'starts_with' => '__toc_'], 1803f65a4e5eSJames Collins ['title' => 'Page Tools', 'starts_with' => '__pagetools_'], 1804f65a4e5eSJames Collins ['title' => 'Footer', 'starts_with' => '__footer_'], 1805f65a4e5eSJames Collins ['title' => 'Table', 'starts_with' => '__table_'], 1806f65a4e5eSJames Collins ['title' => 'Dropdown', 'starts_with' => '__dropdown_'], 1807f65a4e5eSJames Collins ['title' => 'Section Edit', 'starts_with' => '__section_edit_'], 1808f65a4e5eSJames Collins ['title' => 'Tree', 'starts_with' => '__tree_'], 1809f65a4e5eSJames Collins ['title' => 'Tabs', 'starts_with' => '__tab_'], 1810ad182e6dSnomadjimbob ['title' => 'Mikio Plugin', 'starts_with' => '__plugin_', 'heading' => 'h2', 18119ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18129ffe9161Snomadjimbob ], 1813ad182e6dSnomadjimbob ['title' => 'Primary Colours', 'starts_with' => '__plugin_primary_', 'hidden' => $mikioPluginMissing], 1814ad182e6dSnomadjimbob ['title' => 'Secondary Colours', 'starts_with' => '__plugin_secondary_', 18159ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18169ffe9161Snomadjimbob ], 1817ad182e6dSnomadjimbob ['title' => 'Success Colours', 'starts_with' => '__plugin_success_', 'hidden' => $mikioPluginMissing], 1818ad182e6dSnomadjimbob ['title' => 'Danger Colours', 'starts_with' => '__plugin_danger_', 'hidden' => $mikioPluginMissing], 1819ad182e6dSnomadjimbob ['title' => 'Warning Colours', 'starts_with' => '__plugin_warning_', 'hidden' => $mikioPluginMissing], 1820ad182e6dSnomadjimbob ['title' => 'Info Colours', 'starts_with' => '__plugin_info_', 'hidden' => $mikioPluginMissing], 1821ad182e6dSnomadjimbob ['title' => 'Light Colours', 'starts_with' => '__plugin_light_', 'hidden' => $mikioPluginMissing], 1822ad182e6dSnomadjimbob ['title' => 'Dark Colours', 'starts_with' => '__plugin_dark_', 'hidden' => $mikioPluginMissing], 1823ad182e6dSnomadjimbob ['title' => 'Link Colours', 'starts_with' => '__plugin_link_', 'hidden' => $mikioPluginMissing], 1824ad182e6dSnomadjimbob ['title' => 'Carousel', 'starts_with' => '__plugin_carousel_', 'hidden' => $mikioPluginMissing], 1825ad182e6dSnomadjimbob ['title' => 'Steps', 'starts_with' => '__plugin_steps_', 'hidden' => $mikioPluginMissing], 1826ad182e6dSnomadjimbob ['title' => 'Tabgroup', 'starts_with' => '__plugin_tabgroup_', 'hidden' => $mikioPluginMissing], 1827ad182e6dSnomadjimbob ['title' => 'Tooltip', 'starts_with' => '__plugin_tooltip_', 'hidden' => $mikioPluginMissing], 1828cee81679SJames Collins ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'], 1829f65a4e5eSJames Collins ['title' => 'Base', 'starts_with' => '__darkmode_text_'], 1830f65a4e5eSJames Collins ['title' => 'Code', 'starts_with' => '__darkmode_code_'], 1831f65a4e5eSJames Collins ['title' => 'Controls', 'starts_with' => '__darkmode_control_'], 1832f65a4e5eSJames Collins ['title' => 'Header', 'starts_with' => '__darkmode_topheader_'], 1833f65a4e5eSJames Collins ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar_'], 1834f65a4e5eSJames Collins ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar_'], 1835f65a4e5eSJames Collins ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color_'], 1836f65a4e5eSJames Collins ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb_'], 1837f65a4e5eSJames Collins ['title' => 'Hero', 'starts_with' => '__darkmode_hero_'], 1838f65a4e5eSJames Collins ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar_'], 1839f65a4e5eSJames Collins ['title' => 'Content', 'starts_with' => '__darkmode_content_'], 1840f65a4e5eSJames Collins ['title' => 'TOC', 'starts_with' => '__darkmode_toc_'], 1841f65a4e5eSJames Collins ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools_'], 1842f65a4e5eSJames Collins ['title' => 'Footer', 'starts_with' => '__darkmode_footer_'], 1843f65a4e5eSJames Collins ['title' => 'Table', 'starts_with' => '__darkmode_table_'], 1844f65a4e5eSJames Collins ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown_'], 1845f65a4e5eSJames Collins ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit_'], 1846f65a4e5eSJames Collins ['title' => 'Tree', 'starts_with' => '__darkmode_tree_'], 1847f65a4e5eSJames Collins ['title' => 'Tabs', 'starts_with' => '__darkmode_tab_'], 1848ad182e6dSnomadjimbob ['title' => 'Mikio Plugin (Dark mode)', 'starts_with' => '__plugin_darkmode_', 'heading' => 'h2', 18499ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18509ffe9161Snomadjimbob ], 1851ad182e6dSnomadjimbob ['title' => 'Primary Colours', 'starts_with' => '__plugin_darkmode_primary_', 18529ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18539ffe9161Snomadjimbob ], 1854ad182e6dSnomadjimbob ['title' => 'Secondary Colours', 'starts_with' => '__plugin_darkmode_secondary_', 18559ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18569ffe9161Snomadjimbob ], 1857ad182e6dSnomadjimbob ['title' => 'Success Colours', 'starts_with' => '__plugin_darkmode_success_', 18589ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18599ffe9161Snomadjimbob ], 1860ad182e6dSnomadjimbob ['title' => 'Danger Colours', 'starts_with' => '__plugin_darkmode_danger_', 18619ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18629ffe9161Snomadjimbob ], 1863ad182e6dSnomadjimbob ['title' => 'Warning Colours', 'starts_with' => '__plugin_darkmode_warning_', 18649ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18659ffe9161Snomadjimbob ], 1866ad182e6dSnomadjimbob ['title' => 'Info Colours', 'starts_with' => '__plugin_darkmode_info_', 18679ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18689ffe9161Snomadjimbob ], 1869ad182e6dSnomadjimbob ['title' => 'Light Colours', 'starts_with' => '__plugin_darkmode_light_', 18709ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18719ffe9161Snomadjimbob ], 1872ad182e6dSnomadjimbob ['title' => 'Dark Colours', 'starts_with' => '__plugin_darkmode_dark_', 18739ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18749ffe9161Snomadjimbob ], 1875ad182e6dSnomadjimbob ['title' => 'Link Colours', 'starts_with' => '__plugin_darkmode_link_', 18769ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18779ffe9161Snomadjimbob ], 1878ad182e6dSnomadjimbob ['title' => 'Carousel', 'starts_with' => '__plugin_darkmode_carousel_', 18799ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18809ffe9161Snomadjimbob ], 1881ad182e6dSnomadjimbob ['title' => 'Steps', 'starts_with' => '__plugin_darkmode_steps_', 'hidden' => $mikioPluginMissing], 1882ad182e6dSnomadjimbob ['title' => 'Tabgroup', 'starts_with' => '__plugin_darkmode_tabgroup_', 18839ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18849ffe9161Snomadjimbob ], 1885ad182e6dSnomadjimbob ['title' => 'Tooltip', 'starts_with' => '__plugin_darkmode_tooltip_', 'hidden' => $mikioPluginMissing], 1886cee81679SJames Collins ]; 1887cee81679SJames Collins 1888cee81679SJames Collins foreach ($style_headers as $header) { 1889cee81679SJames Collins if (array_key_exists('heading', $header) === false) { 1890cee81679SJames Collins $header['heading'] = 'h3'; 1891cee81679SJames Collins } 1892cee81679SJames Collins 1893ad182e6dSnomadjimbob if (array_key_exists('hidden', $header) === false) { 1894ad182e6dSnomadjimbob $header['hidden'] = false; 1895ad182e6dSnomadjimbob } 1896ad182e6dSnomadjimbob 18971244e3ceSJames Collins $content = preg_replace( 1898f65a4e5eSJames Collins '/(<tr>\s*<td>\s*<label for="tpl__' . $header['starts_with'] . '.+?<\/tr>)/s', 18999ffe9161Snomadjimbob '</tbody></table><' . $header['heading'] . ' style="display:' . 19009ffe9161Snomadjimbob ($header['hidden'] === true ? 'none' : 'block') . '">' . 19019ffe9161Snomadjimbob $header['title'] . '</' . $header['heading'] . '> 1902ad182e6dSnomadjimbob <table style="display:' . ($header['hidden'] === true ? 'none' : 'table') . '"><tbody>$1', 19031244e3ceSJames Collins $content, 19041244e3ceSJames Collins 1 19051244e3ceSJames Collins ); 1906cee81679SJames Collins } 1907f65a4e5eSJames Collins 1908dea1f088SJames Collins $content = preg_replace_callback('/<input type="color"[^>]*>/', function ($match) { 1909dea1f088SJames Collins // Get the ID of the <input type="color"> element 1910dea1f088SJames Collins preg_match('/id="([^"]*)"/', $match[0], $matches); 1911dea1f088SJames Collins 1912dea1f088SJames Collins // Replace type with text and remove the id attribute 19132c87ab0dSJames Collins $replacement = preg_replace( 19142c87ab0dSJames Collins ['/type="color"/', '/id="([^"]*)"/'], 19152c87ab0dSJames Collins ['type="text" class="mikio-color-text-input"', 'for="$1"'], 19162c87ab0dSJames Collins $match[0] 19172c87ab0dSJames Collins ); 1918dea1f088SJames Collins 1919dea1f088SJames Collins return '<div class="mikio-color-picker">' . $replacement . $match[0] . '</div>'; 1920dea1f088SJames Collins }, $content); 1921bb5a3dd1SJames Collins }//end if 1922ab45ba71SJames Collins 19233a385f2cSJames Collins if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) { 1924a8eebd82SJames Collins $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content); 1925a8eebd82SJames Collins } 1926ab45ba71SJames Collins 1927a8eebd82SJames Collins // Page Revisions - Table Fix 19289cff245bSJames Collins if (strpos($content, 'id="page__revisions"') !== false) { 19299cff245bSJames Collins $content = preg_replace( 19309cff245bSJames Collins '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/', 19319cff245bSJames Collins '<span>$1</span>', 19329cff245bSJames Collins $content 19339cff245bSJames Collins ); 1934a8eebd82SJames Collins } 1935ab45ba71SJames Collins 19369cff245bSJames Collins $html = new \simple_html_dom(); 1937bc1032d9SJames Collins $html->stripRNAttrValues = false; 1938c165b184SJames Collins $html->load($content, true, false); 1939c165b184SJames Collins 19409cff245bSJames Collins if ($html === false) { 19419cff245bSJames Collins return $content; 19429cff245bSJames Collins } 1943ab45ba71SJames Collins 1944ab45ba71SJames Collins /* Buttons */ 1945ab45ba71SJames Collins foreach ($html->find('#config__manager button') as $node) { 1946ab45ba71SJames Collins $c = explode(' ', $node->class); 19479cff245bSJames Collins if (in_array('mikio-button', $c) === false) { 19489cff245bSJames Collins $c[] = 'mikio-button'; 19499cff245bSJames Collins } 1950ab45ba71SJames Collins $node->class = implode(' ', $c); 1951c165b184SJames Collins } 1952c165b184SJames Collins 1953ab45ba71SJames Collins 1954ab45ba71SJames Collins /* Buttons - Primary */ 1955ab45ba71SJames Collins foreach ($html->find('#config__manager [type=submit]') as $node) { 1956ab45ba71SJames Collins $c = explode(' ', $node->class); 19579cff245bSJames Collins if (in_array('mikio-primary', $c) === false) { 19589cff245bSJames Collins $c[] = 'mikio-primary'; 19599cff245bSJames Collins } 1960ab45ba71SJames Collins $node->class = implode(' ', $c); 1961ab45ba71SJames Collins } 1962ab45ba71SJames Collins 1963a8eebd82SJames Collins /* Hide page title if hero is enabled */ 19649cff245bSJames Collins if ($this->getConf('heroTitle') === true && $ACT !== 'preview') { 19651785fc73SJames Collins $pageTitle = $this->parsePageTitle(); 196647161538SJames Collins 196747161538SJames Collins foreach ($html->find('h1,h2,h3,h4') as $elm) { 19689cff245bSJames Collins if ($elm->innertext === $pageTitle) { 1969a8eebd82SJames Collins // $elm->innertext = ''; 1970a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1971a8eebd82SJames Collins 197247161538SJames Collins break; 197347161538SJames Collins } 197447161538SJames Collins } 197547161538SJames Collins } 1976c165b184SJames Collins 1977a8eebd82SJames Collins /* Hero subtitle */ 19782b4583abSJames Collins foreach ($html->find('p') as $elm) { 1979d0d6c450SJames Collins if (preg_match('/[~-]~hero-subtitle (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) { 1980d0d6c450SJames Collins $subtitle = $matches[1]; 1981a8eebd82SJames Collins $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')'; 1982a8eebd82SJames Collins 1983d0d6c450SJames Collins $elm->innertext = preg_replace('/[~-]~hero-subtitle (.+?)~[~-]/ui', '', $elm->innertext); 19842b4583abSJames Collins break; 19852b4583abSJames Collins } 19862b4583abSJames Collins } 19872b4583abSJames Collins 1988a8eebd82SJames Collins /* Hero image */ 1989a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1990a8eebd82SJames Collins $image = ''; 1991d0d6c450SJames Collins preg_match('/[~-]~hero-image (.+?)~[~-](?!.?")/ui', $elm->innertext, $matches); 1992a8eebd82SJames Collins if (count($matches) > 0) { 1993a8eebd82SJames Collins preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches); 1994a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1995a8eebd82SJames Collins $image = $imageTagMatches[1]; 1996a8eebd82SJames Collins } else { 1997a8eebd82SJames Collins preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches); 1998a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1999a8eebd82SJames Collins $image = $imageTagMatches[1]; 2000a8eebd82SJames Collins } else { 2001a8eebd82SJames Collins $image = strip_tags($matches[1]); 20029cff245bSJames Collins if (stripos($image, ':') === false) { 20039cff245bSJames Collins $image = str_replace(['{', '}'], '', $image); 2004a8eebd82SJames Collins $i = stripos($image, '?'); 20059cff245bSJames Collins if ($i !== false) { 2006a8eebd82SJames Collins $image = substr($image, 0, $i); 2007c165b184SJames Collins } 2008c165b184SJames Collins 2009a8eebd82SJames Collins $image = ml($image, '', true, '', false); 2010ab45ba71SJames Collins } 2011ab45ba71SJames Collins } 2012ab45ba71SJames Collins } 2013ab45ba71SJames Collins 2014a8eebd82SJames Collins $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')'; 2015a8eebd82SJames Collins 2016d0d6c450SJames Collins $elm->innertext = preg_replace('/[~-]~hero-image (.+?)~[~-].*/ui', '', $elm->innertext); 20179cff245bSJames Collins }//end if 20189cff245bSJames Collins }//end foreach 2019ab45ba71SJames Collins 20209cff245bSJames Collins /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color] 20219cff245bSJames Collins [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */ 2022a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 2023d0d6c450SJames Collins if (preg_match('/[~-]~hero-colors (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) { 2024d0d6c450SJames Collins $subtitle = $matches[1]; 2025d0d6c450SJames Collins $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $subtitle . '\')'; 2026ab45ba71SJames Collins 2027d0d6c450SJames Collins $elm->innertext = preg_replace('/[~-]~hero-colors (.+?)~[~-]/ui', '', $elm->innertext); 2028a8eebd82SJames Collins break; 2029ab45ba71SJames Collins } 2030ab45ba71SJames Collins } 2031ab45ba71SJames Collins 203296ec8e1eSJames Collins /* Hide parts - ~~hide-parts [parts]~~ */ 203396ec8e1eSJames Collins foreach ($html->find('p') as $elm) { 20343a44a74aSJames Collins if (preg_match('/[~-]~hide-parts (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) { 2035d0d6c450SJames Collins $parts = explode(' ', $matches[1]); 203696ec8e1eSJames Collins $script = ''; 203796ec8e1eSJames Collins 203896ec8e1eSJames Collins foreach ($parts as $part) { 203996ec8e1eSJames Collins if (strlen($part) > 0) { 204096ec8e1eSJames Collins $script .= 'mikio.hidePart(\'' . $part . '\');'; 204196ec8e1eSJames Collins } 204296ec8e1eSJames Collins } 204396ec8e1eSJames Collins 204496ec8e1eSJames Collins if (strlen($script) > 0) { 204596ec8e1eSJames Collins $this->footerScript['hide-parts'] = $script; 204696ec8e1eSJames Collins } 204796ec8e1eSJames Collins 20483a44a74aSJames Collins $elm->innertext = preg_replace('/[~-]~hide-parts (.+?)~[~-]/ui', '', $elm->innertext); 204996ec8e1eSJames Collins break; 2050d0d6c450SJames Collins } 20519cff245bSJames Collins }//end foreach 205296ec8e1eSJames Collins 205396ec8e1eSJames Collins 2054a8eebd82SJames Collins /* Page Tags (tag plugin) */ 20559cff245bSJames Collins if ($this->getConf('tagsConsolidate') === true) { 2056a8eebd82SJames Collins $tags = ''; 2057a8eebd82SJames Collins foreach ($html->find('div.tags a') as $elm) { 2058a8eebd82SJames Collins $tags .= $elm->outertext; 2059a8eebd82SJames Collins } 2060a8eebd82SJames Collins 2061a8eebd82SJames Collins foreach ($html->find('div.tags') as $elm) { 2062a8eebd82SJames Collins $elm->innertext = ''; 2063a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 2064a8eebd82SJames Collins } 2065a8eebd82SJames Collins 20663a385f2cSJames Collins if (empty($tags) === false) { 2067a8eebd82SJames Collins $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')'; 2068a8eebd82SJames Collins } 2069ab45ba71SJames Collins } 2070ab45ba71SJames Collins 2071ab45ba71SJames Collins // Configuration Manager 20723a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 2073ab45ba71SJames Collins // Additional save buttons 2074ab45ba71SJames Collins foreach ($html->find('#config__manager') as $cm) { 2075ab45ba71SJames Collins $saveButtons = ''; 2076ab45ba71SJames Collins 2077ab45ba71SJames Collins foreach ($cm->find('p') as $elm) { 2078ab45ba71SJames Collins $saveButtons = $elm->outertext; 2079a8eebd82SJames Collins $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons); 2080ab45ba71SJames Collins $elm->outertext = ''; 2081ab45ba71SJames Collins } 2082ab45ba71SJames Collins 2083ab45ba71SJames Collins foreach ($cm->find('fieldset') as $elm) { 2084ab45ba71SJames Collins $elm->innertext .= $saveButtons; 2085ab45ba71SJames Collins } 2086ab45ba71SJames Collins } 2087ab45ba71SJames Collins } 2088ab45ba71SJames Collins 2089ab45ba71SJames Collins $content = $html->save(); 2090c165b184SJames Collins $html->clear(); 2091c165b184SJames Collins unset($html); 2092c165b184SJames Collins 2093c165b184SJames Collins return $content; 2094c165b184SJames Collins } 20952b4583abSJames Collins 20962b4583abSJames Collins 2097a8eebd82SJames Collins /** 2098a8eebd82SJames Collins * Get DokuWiki namespace/page/URI as link 2099a8eebd82SJames Collins * 21009cff245bSJames Collins * @param string $str String to parse. 21019cff245bSJames Collins * @return string parsed URI 2102a8eebd82SJames Collins */ 21039cff245bSJames Collins public function getLink(string $str) 210410b40067Snomadjimbob { 21052b4583abSJames Collins $i = strpos($str, '://'); 21069cff245bSJames Collins if ($i !== false) { 21079cff245bSJames Collins return $str; 21089cff245bSJames Collins } 21092b4583abSJames Collins 21102b4583abSJames Collins return wl($str); 21112b4583abSJames Collins } 2112ab45ba71SJames Collins 2113ab45ba71SJames Collins 2114a8eebd82SJames Collins /** 2115a8eebd82SJames Collins * Check if the user can edit current namespace/page 2116a8eebd82SJames Collins * 2117a8eebd82SJames Collins * @return boolean user can edit 2118a8eebd82SJames Collins */ 211910b40067Snomadjimbob public function userCanEdit() 212010b40067Snomadjimbob { 2121ab45ba71SJames Collins global $INFO; 2122ab45ba71SJames Collins global $ID; 2123ab45ba71SJames Collins 2124ab45ba71SJames Collins $wiki_file = wikiFN($ID); 21259cff245bSJames Collins if (@file_exists($wiki_file) === false) { 21269cff245bSJames Collins return true; 21279cff245bSJames Collins } 21289cff245bSJames Collins if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) { 21299cff245bSJames Collins return true; 21309cff245bSJames Collins } 2131a8eebd82SJames Collins // $meta_file = metaFN($ID, '.meta'); 21329cff245bSJames Collins if ($INFO['meta']['user'] === false) { 21339cff245bSJames Collins return true; 21349cff245bSJames Collins } 21359cff245bSJames Collins if ($INFO['client'] === $INFO['meta']['user']) { 21369cff245bSJames Collins return true; 21379cff245bSJames Collins } 2138ab45ba71SJames Collins 2139ab45ba71SJames Collins return false; 2140c165b184SJames Collins } 214147161538SJames Collins 214247161538SJames Collins 2143a8eebd82SJames Collins /** 2144a8eebd82SJames Collins * Search for and return the uri of a media file 2145a8eebd82SJames Collins * 21469cff245bSJames Collins * @param string $image Image name to search for (without extension). 21479cff245bSJames Collins * @param boolean $searchCurrentNS Search the current namespace. 21489cff245bSJames Collins * @param boolean $propagate Propagate search through the namespace. 21499cff245bSJames Collins * @return string URI of the found media file 2150a8eebd82SJames Collins */ 21519cff245bSJames Collins public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true) 215210b40067Snomadjimbob { 2153ab45ba71SJames Collins global $INFO; 2154a8eebd82SJames Collins 21559cff245bSJames Collins $ext = ['png', 'jpg', 'gif', 'svg']; 2156ab45ba71SJames Collins 21579cff245bSJames Collins if ($searchCurrentNS === true) { 21589cff245bSJames Collins $prefix[] = ':' . $INFO['namespace'] . ':'; 21599cff245bSJames Collins } 21609cff245bSJames Collins if ($propagate === true) { 2161ab45ba71SJames Collins $prefix[] = ':'; 2162ab45ba71SJames Collins $prefix[] = ':wiki:'; 2163a8eebd82SJames Collins } 2164ab45ba71SJames Collins $theme = $this->getConf('customTheme'); 21653a385f2cSJames Collins if (empty($theme) === false) { 21669cff245bSJames Collins $prefix[] = 'themes/' . $theme . '/images/'; 21679cff245bSJames Collins } 2168ab45ba71SJames Collins $prefix[] = 'images/'; 2169ab45ba71SJames Collins 21709cff245bSJames Collins $search = []; 2171ab45ba71SJames Collins foreach ($prefix as $pitem) { 2172ab45ba71SJames Collins foreach ($ext as $eitem) { 2173ab45ba71SJames Collins $search[] = $pitem . $image . '.' . $eitem; 2174ab45ba71SJames Collins } 2175ab45ba71SJames Collins } 2176ab45ba71SJames Collins 2177ab45ba71SJames Collins $img = ''; 2178ab45ba71SJames Collins $file = ''; 2179ab45ba71SJames Collins $url = ''; 2180ab45ba71SJames Collins $ismedia = false; 2181ab45ba71SJames Collins $found = false; 2182ab45ba71SJames Collins 2183ab45ba71SJames Collins foreach ($search as $img) { 21843a385f2cSJames Collins if (strcasecmp(substr($img, 0, 1), ':') === 0) { 2185ab45ba71SJames Collins $file = mediaFN($img); 2186ab45ba71SJames Collins $ismedia = true; 2187ab45ba71SJames Collins } else { 2188ab45ba71SJames Collins $file = tpl_incdir() . $img; 2189ab45ba71SJames Collins $ismedia = false; 2190ab45ba71SJames Collins } 2191ab45ba71SJames Collins 21929cff245bSJames Collins if (file_exists($file) === true) { 2193ab45ba71SJames Collins $found = true; 2194ab45ba71SJames Collins break; 2195ab45ba71SJames Collins } 2196ab45ba71SJames Collins } 2197ab45ba71SJames Collins 21989cff245bSJames Collins if ($found === false) { 21999cff245bSJames Collins return false; 22009cff245bSJames Collins } 2201ab45ba71SJames Collins 22029cff245bSJames Collins if ($ismedia === true) { 2203ab45ba71SJames Collins $url = ml($img, '', true, '', false); 2204ab45ba71SJames Collins } else { 2205ab45ba71SJames Collins $url = tpl_basedir() . $img; 2206ab45ba71SJames Collins } 2207ab45ba71SJames Collins 2208ab45ba71SJames Collins return $url; 2209ab45ba71SJames Collins } 2210ab45ba71SJames Collins 2211a8eebd82SJames Collins 2212a8eebd82SJames Collins /** 2213ab45ba71SJames Collins * Print or return the page title 2214ab45ba71SJames Collins * 22159cff245bSJames Collins * @param string $page Page id or empty string for current page. 2216ab45ba71SJames Collins * @return string generated content 2217ab45ba71SJames Collins */ 22189cff245bSJames Collins public function getPageTitle(string $page = '') 221910b40067Snomadjimbob { 2220ab45ba71SJames Collins global $ID, $conf; 2221ab45ba71SJames Collins 2222ab45ba71SJames Collins $html = ''; 2223ab45ba71SJames Collins 22243a385f2cSJames Collins if (empty($page) === true) { 22259cff245bSJames Collins $page = $ID; 22269cff245bSJames Collins } 2227ab45ba71SJames Collins 2228ab45ba71SJames Collins $html = p_get_first_heading($page); 2229ab45ba71SJames Collins $html = strip_tags($html); 2230ab45ba71SJames Collins $html = preg_replace('/\s+/', ' ', $html); 2231ab45ba71SJames Collins $html .= ' [' . strip_tags($conf['title']) . ']'; 2232ab45ba71SJames Collins $html = trim($html); 2233ab45ba71SJames Collins 2234ab45ba71SJames Collins return $html; 2235ab45ba71SJames Collins } 2236a8eebd82SJames Collins 2237a8eebd82SJames Collins 2238a8eebd82SJames Collins /** 2239a8eebd82SJames Collins * Return inline theme icon 2240a8eebd82SJames Collins * 22419cff245bSJames Collins * @param string $type Icon to retreive. 22429e41d878SJames Collins * @param string $class Classname to insert. 22439cff245bSJames Collins * @return string HTML icon content 2244a8eebd82SJames Collins */ 22459e41d878SJames Collins public function mikioInlineIcon(string $type, string $class = "") 224610b40067Snomadjimbob { 22479e41d878SJames Collins if (is_array($class) === true) { 22489e41d878SJames Collins $class = explode(' ', $class); 22499e41d878SJames Collins } 22509e41d878SJames Collins 22519e41d878SJames Collins if (strlen($class) > 0) { 22529e41d878SJames Collins $class = ' ' . $class; 22539e41d878SJames Collins } 22549e41d878SJames Collins 2255a8eebd82SJames Collins switch ($type) { 2256a8eebd82SJames Collins case 'wrench': 2257906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 2258906e1a13SJames Collins1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,53.152542,1217.0847)"><path d="m 384,64 q 0,26 -19,45 -19, 2259906e1a13SJames Collins19 -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, 2260906e1a13SJames Collins-37 -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, 2261906e1a13SJames Collins435 q 0,-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 2262906e1a13SJames Collins131.5,131.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, 2263906e1a13SJames Collins-107 q 5,3 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>'; 2264a8eebd82SJames Collins case 'file': 2265906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2266906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991"> 2267906e1a13SJames Collins<path d="M 128,0 H 1152 V 768 H 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 2268906e1a13SJames Collins1280,768 V -32 q 0,-40 -28,-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 2269906e1a13SJames Collinsq 40,0 88,-20 48,-20 76,-48 l 408,-408 q 28,-28 48,-76 20,-48 20,-88 z" id="path2993" inkscape:connector-curvature="0" 22709cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 2271a8eebd82SJames Collins case 'gear': 2272906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2273906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027"> 2274906e1a13SJames Collins<path d="m 1024,640 q 0,106 -75,181 -75,75 -181,75 -106,0 -181,-75 -75,-75 -75,-181 0,-106 75,-181 75,-75 181,-75 106,0 2275906e1a13SJames Collins181,75 75,75 75,181 z m 512,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 2276906e1a13SJames Collins10,-25 0,-13 -9,-23 -27,-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 2277906e1a13SJames Collins-36,-28 H 657 q -14,0 -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 2278906e1a13SJames Collins147,186 q -7,10 -7,23 0,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 2279906e1a13SJames Collinsq 0,12 8,23 8,11 19,13 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, 2280906e1a13SJames Collins71.5 13,0 26,-10 l 138,-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 2281906e1a13SJames Collinsq 49,-16 90,-37 l 142,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 2282906e1a13SJames Collins-54,-70.5 26,-50 41,-98 l 183,-28 q 13,-2 21,-12.5 8,-10.5 8,-23.5 z" id="path3029" inkscape:connector-curvature="0" /> 2283906e1a13SJames Collins</g></svg>'; 2284a8eebd82SJames Collins case 'user': 2285906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2286906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M 2287906e1a13SJames Collins1408,131 Q 1408,11 1335,-58.5 1262,-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 2288906e1a13SJames Collins28,402 44,452 q 16,50 43,97.5 27,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, 2289906e1a13SJames Collins-26.5 108,-48 Q 637,565 704,565 q 67,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 2290906e1a13SJames Collins50.5,-20 85.5,-53.5 35,-33.5 62,-81 27,-47.5 43,-97.5 16,-50 26.5,-108.5 10.5,-58.5 14,-109 Q 1408,184 1408,131 z m 2291906e1a13SJames Collins-320,893 Q 1088,865 975.5,752.5 863,640 704,640 545,640 432.5,752.5 320,865 320,1024 320,1183 432.5,1295.5 545,1408 704, 2292906e1a13SJames Collins1408 863,1408 975.5,1295.5 1088,1183 1088,1024 z"/></g></svg>'; 2293a8eebd82SJames Collins case 'search': 22949e41d878SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" 22959cff245bSJames 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 22969cff245bSJames 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 22979cff245bSJames 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 22989cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>'; 2299a8eebd82SJames Collins case 'home': 2300906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2301906e1a13SJames CollinsviewBox="0 -256 1792 1792" aria-hidden="true" style="fill:currentColor"><g 2302906e1a13SJames Collinstransform="matrix(1,0,0,-1,68.338983,1285.4237)" id="g3015"><path d="M 1408,544 V 64 Q 1408,38 1389,19 1370,0 1344,0 H 2303906e1a13SJames Collins960 V 384 H 704 V 0 H 320 q -26,0 -45,19 -19,19 -19,45 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 2304906e1a13SJames Collinsm 223,69 -62,-74 q -8,-9 -21,-11 h -3 q -13,0 -21,7 L 832,1112 140,535 q -12,-8 -24,-7 -13,2 -21,11 l -62,74 q -8,10 2305906e1a13SJames Collins-7,23.5 1,13.5 11,21.5 l 719,599 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, 2306906e1a13SJames Collins-9 9,-23 V 840 l 219,-182 q 10,-8 11,-21.5 1,-13.5 -7,-23.5 z" id="path3017" inkscape:connector-curvature="0" 23079cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 23089e41d878SJames Collins case 'sun': 2309906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2310906e1a13SJames Collinsstyle="fill:currentColor" viewBox="0 0 16 16"><path d="M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0 2311906e1a13SJames Collins0 8zm.5-9.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm0 11a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm5-5a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-11 2312906e1a13SJames Collins0a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm9.743-4.036a.5.5 0 1 1-.707-.707.5.5 0 0 1 .707.707zm-7.779 7.779a.5.5 0 1 2313906e1a13SJames Collins1-.707-.707.5.5 0 0 1 .707.707zm7.072 0a.5.5 0 1 1 .707-.707.5.5 0 0 1-.707.707zM3.757 4.464a.5.5 0 1 1 .707-.707.5.5 2314906e1a13SJames Collins0 0 1-.707.707z" /></svg>'; 23159e41d878SJames Collins case 'moon': 2316906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2317906e1a13SJames Collinsstyle="fill:currentColor" viewBox="0 0 16 16"><path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 2318906e1a13SJames Collins4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 2319906e1a13SJames Collins1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278zM4.858 1.311A7.269 7.269 0 0 0 2320906e1a13SJames Collins1.025 7.71c0 4.02 3.279 7.276 7.319 7.276a7.316 7.316 0 0 0 5.205-2.162c-.337.042-.68.063-1.029.063-4.61 2321906e1a13SJames Collins0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>'; 232234d5f19aSJames Collins case 'sunmoon': 2323d0fba6d1SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2324d0fba6d1SJames Collinsstyle="fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10" 2325d0fba6d1SJames CollinsviewBox="0 0 32 32"><line x1="16" y1="3" x2="16" y2="29"/><path d="M16,23c-3.87,0-7-3.13-7-7s3.13-7,7-7"/><line 2326d0fba6d1SJames Collinsx1="6.81" y1="6.81" x2="8.93" y2="8.93"/><line x1="3" y1="16" x2="6" y2="16"/><line x1="6.81" y1="25.19" x2="8.93" 2327d0fba6d1SJames Collinsy2="23.07"/><path d="M16,12.55C17.2,10.43,19.48,9,22.09,9c0.16,0,0.31,0.01,0.47,0.02c-1.67,0.88-2.8,2.63-2.8,4.64c0,2.9, 2328d0fba6d1SJames Collins2.35,5.25,5.25,5.25c1.6,0,3.03-0.72,3.99-1.85C28.48,20.43,25.59,23,22.09,23c-2.61,0-4.89-1.43-6.09-3.55"/></svg>'; 2329f65a4e5eSJames Collins case 'hamburger': 2330f65a4e5eSJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" 2331f65a4e5eSJames Collinsstyle="fill:currentColor"><path d="M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 2332f65a4e5eSJames Collins76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 2333f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 2334f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16z"/></svg>'; 2335f65a4e5eSJames Collins case 'down-arrow': 2336f65a4e5eSJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" 2337f65a4e5eSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M16.003 18.626l7.081-7.081L25 13.46l-8.997 8.998-9.003-9 2338f65a4e5eSJames Collins1.917-1.916z"/></svg>'; 23393a3ece10SJames Collins case 'language': 23403a3ece10SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" width="16" 23413a3ece10SJames Collinsheight="16" fill="currentColor" viewBox="0 0 16 16"><path d="M4.545 6.714 4.11 23423a3ece10SJames Collins8H3l1.862-5h1.284L8 8H6.833l-.435-1.286H4.545zm1.634-.736L5.5 3.956h-.049l-.679 2.022H6.18z"/><path d="M0 2a2 2 0 0 1 23433a3ece10SJames Collins2-2h7a2 2 0 0 1 2 2v3h3a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2v-3H2a2 2 0 0 1-2-2V2zm2-1a1 1 0 0 0-1 1v7a1 1 0 0 23443a3ece10SJames Collins0 1 1h7a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H2zm7.138 9.995c.193.301.402.583.63.846-.748.575-1.673 1.001-2.768 23453a3ece10SJames Collins1.292.178.217.451.635.555.867 1.125-.359 2.08-.844 2.886-1.494.777.665 1.739 1.165 2.93 23463a3ece10SJames Collins1.472.133-.254.414-.673.629-.89-1.125-.253-2.057-.694-2.82-1.284.681-.747 1.222-1.651 23473a3ece10SJames Collins1.621-2.757H14V8h-3v1.047h.765c-.318.844-.74 1.546-1.272 2.13a6.066 6.066 0 0 1-.415-.492 1.988 1.988 0 0 1-.94.31z"/> 23483a3ece10SJames Collins</svg>'; 23499cff245bSJames Collins }//end switch 2350ab45ba71SJames Collins 2351a8eebd82SJames Collins return ''; 2352a8eebd82SJames Collins } 2353ab45ba71SJames Collins 2354a8eebd82SJames Collins /** 2355a8eebd82SJames Collins * Finalize theme 23569cff245bSJames Collins * 23579cff245bSJames Collins * @return void 2358a8eebd82SJames Collins */ 235910b40067Snomadjimbob public function finalize() 236010b40067Snomadjimbob { 2361a8eebd82SJames Collins } 23621785fc73SJames Collins 23631785fc73SJames Collins /** 23641785fc73SJames Collins * Show Messages 23659cff245bSJames Collins * 23669cff245bSJames Collins * @return void 23671785fc73SJames Collins */ 236810b40067Snomadjimbob public function showMessages() 236910b40067Snomadjimbob { 23701785fc73SJames Collins global $ACT; 23711785fc73SJames Collins 23729cff245bSJames Collins if ($this->lessIgnored === true) { 23739cff245bSJames Collins msg( 23749cff245bSJames Collins 'useLESS is enabled on the Mikio template, however is not supported on this server', 23759cff245bSJames Collins 2, 23769cff245bSJames Collins '', 23779cff245bSJames Collins '', 23789cff245bSJames Collins MSG_ADMINS_ONLY 23799cff245bSJames Collins ); 2380a8df40efSJames Collins } 2381a8df40efSJames Collins 23821785fc73SJames Collins $show = $this->getConf('showNotifications'); 23833a385f2cSJames Collins if ( 23844f8225e4SJames Collins strlen($show) === 0 || 23853a385f2cSJames Collins strcasecmp($show, 'always') === 0 || 23863a385f2cSJames Collins (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0) 23873a385f2cSJames Collins ) { 23881785fc73SJames Collins global $MSG, $MSG_shown; 23891785fc73SJames Collins 23904f8225e4SJames Collins if (isset($MSG) !== false) { 23919cff245bSJames Collins if (isset($MSG_shown) === false) { 23929cff245bSJames Collins $MSG_shown = []; 2393a8df40efSJames Collins } 23941785fc73SJames Collins 23951785fc73SJames Collins foreach ($MSG as $msg) { 23961785fc73SJames Collins $hash = md5($msg['msg']); 23979cff245bSJames Collins if (isset($MSG_shown[$hash]) === true) { 23981785fc73SJames Collins continue; 23991785fc73SJames Collins } 24001785fc73SJames Collins // skip double messages 24011785fc73SJames Collins 24029cff245bSJames Collins if (info_msg_allowed($msg) === true) { 24039cff245bSJames Collins echo '<div class="' . $msg['lvl'] . '">'; 24049cff245bSJames Collins echo $msg['msg']; 24059cff245bSJames Collins echo '</div>'; 24061785fc73SJames Collins } 24071785fc73SJames Collins 2408a8df40efSJames Collins $MSG_shown[$hash] = true; 24091785fc73SJames Collins } 24101785fc73SJames Collins 24111785fc73SJames Collins unset($GLOBALS['MSG']); 24129cff245bSJames Collins }//end if 24134f8225e4SJames Collins 24144f8225e4SJames Collins if (strlen($this->includedPageNotifications) > 0) { 24154f8225e4SJames Collins echo $this->includedPageNotifications; 24164f8225e4SJames Collins } 24174f8225e4SJames Collins }//end if 24181785fc73SJames Collins } 24197ac0a6efSJames Collins 24207ac0a6efSJames Collins /** 24217ac0a6efSJames Collins * Dokuwiki version 24227ac0a6efSJames Collins * 24237ac0a6efSJames Collins * @return string the dw version name 24247ac0a6efSJames Collins */ 24259cff245bSJames Collins public function dwVersion() 24269cff245bSJames Collins { 24279cff245bSJames Collins if (function_exists('getVersionData') === true) { 24287ac0a6efSJames Collins $version_data = getVersionData(); 24299cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 24307ac0a6efSJames Collins $version_items = explode(' ', $version_data['date']); 24317ac0a6efSJames Collins if (count($version_items) >= 2) { 24327ac0a6efSJames Collins return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1])); 24337ac0a6efSJames Collins } 24347ac0a6efSJames Collins } 24357ac0a6efSJames Collins } 24367ac0a6efSJames Collins 24377ac0a6efSJames Collins return 'unknown'; 24387ac0a6efSJames Collins } 2439e4c4fb13SJames Collins 2440e4c4fb13SJames Collins /** 2441e4c4fb13SJames Collins * Dokuwiki version number 2442e4c4fb13SJames Collins * 2443e4c4fb13SJames Collins * @return string the dw version date converted to integer 2444e4c4fb13SJames Collins */ 24459cff245bSJames Collins public function dwVersionNumber() 24469cff245bSJames Collins { 24479cff245bSJames Collins if (function_exists('getVersionData') === true) { 2448e4c4fb13SJames Collins $version_data = getVersionData(); 24499cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 2450e4c4fb13SJames Collins $version_items = explode(' ', $version_data['date']); 2451e4c4fb13SJames Collins if (count($version_items) >= 1) { 2452e4c4fb13SJames Collins return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0]))); 2453e4c4fb13SJames Collins } 2454e4c4fb13SJames Collins } 2455e4c4fb13SJames Collins } 2456e4c4fb13SJames Collins 2457e4c4fb13SJames Collins return 0; 2458e4c4fb13SJames Collins } 2459a8eebd82SJames Collins} 2460ab45ba71SJames Collins 2461ab45ba71SJames Collinsglobal $TEMPLATE; 246247161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance(); 2463