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'); 19daf2cd7aSJames 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 192c10b0769SJames Collins if ($this->dwVersionNumber() >= 20200729 || $this->dwVersionNumber() == 0) { 193c1ecb866SJames Collins // greator than hogfather - defer always on 194c10b0769SJames Collins if ($this->dwVersionNumber() >= 20200729 || $this->dwVersionNumber() == 0) { 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', 3082d241f94SJames Collins 'values' => ['admin', 'always', 'none', '', 'never'] 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'], 348daf2cd7aSJames 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 ) { 572*fd16ea41SJames Collins $title = isset($attr['title']) && $attr['title'] !== 0 ? $attr['title'] : $item->getTitle(); 573*fd16ea41SJames Collins 5749cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . 575*fd16ea41SJames Collins ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $title . '"' . (isset($attr['accesskey']) && $attr['accesskey'] !== '' ? ' accesskey="' . $attr['accesskey'] . '"' : '') . '>'; 5769cff245bSJames Collins if ($showIcons === true) { 5779cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 5789cff245bSJames Collins } 5799cff245bSJames Collins if ($showText === true || $isDropDown === true) { 5809cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 5819cff245bSJames Collins } 582ab45ba71SJames Collins $itemHtml .= '</a>'; 583ab45ba71SJames Collins 584ab45ba71SJames Collins $pageToolsMenu[] = $itemHtml; 5852b4583abSJames Collins } 5869cff245bSJames Collins }//end if 5879cff245bSJames Collins }//end foreach 5882b4583abSJames Collins 589ab45ba71SJames Collins $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action'); 590ab45ba71SJames Collins foreach ($items as $item) { 591ab45ba71SJames Collins $itemHtml = ''; 5922b4583abSJames Collins 593905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5949cff245bSJames Collins if ( 5953a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 5963a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 5973a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5989cff245bSJames Collins ) { 5999cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' . 6009cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 6019cff245bSJames Collins if ($showIcons === true) { 6029cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 6039cff245bSJames Collins } 6049cff245bSJames Collins if ($showText === true || $isDropDown === true) { 6059cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 6069cff245bSJames Collins } 607ab45ba71SJames Collins $itemHtml .= '</a>'; 6082b4583abSJames Collins 609ab45ba71SJames Collins $siteToolsMenu[] = $itemHtml; 6102b4583abSJames Collins } 6119cff245bSJames Collins }//end foreach 6122b4583abSJames Collins 613ab45ba71SJames Collins $items = (new \dokuwiki\Menu\UserMenu())->getItems('action'); 614ab45ba71SJames Collins foreach ($items as $item) { 615ab45ba71SJames Collins $itemHtml = ''; 616ab45ba71SJames Collins 617905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 6189cff245bSJames Collins if ( 6193a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 6203a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 6213a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 6229cff245bSJames Collins ) { 6239cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' . 6249cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 6259cff245bSJames Collins if ($showIcons === true) { 6269cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 6279cff245bSJames Collins } 6289cff245bSJames Collins if ($showText === true || $isDropDown === true) { 6299cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 6309cff245bSJames Collins } 631ab45ba71SJames Collins $itemHtml .= '</a>'; 632ab45ba71SJames Collins 633ab45ba71SJames Collins $userToolsMenu[] = $itemHtml; 634ab45ba71SJames Collins } 6359cff245bSJames Collins }//end foreach 636ab45ba71SJames Collins 637ab45ba71SJames Collins 638ab45ba71SJames Collins switch ($this->getConf('navbarDWMenuCombine')) { 639ab45ba71SJames Collins case 'dropdown': 640ab45ba71SJames Collins $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">'; 6419cff245bSJames Collins $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button" 6429cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6439cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('file') : '') . 6449cff245bSJames Collins ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] . 6459cff245bSJames Collins '</span>') . '</a>'; 646a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 647ab45ba71SJames Collins 648ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 649ab45ba71SJames Collins $html .= $item; 650ab45ba71SJames Collins } 651ab45ba71SJames Collins 652ab45ba71SJames Collins $html .= '</div>'; 653ab45ba71SJames Collins $html .= '</li>'; 654ab45ba71SJames Collins 655a8eebd82SJames Collins $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">'; 6569cff245bSJames Collins $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button" 6579cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6589cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('gear') : '') . 6599cff245bSJames Collins ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' . 6609cff245bSJames Collins $lang['site_tools'] . '</span>') . '</a>'; 661a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 662ab45ba71SJames Collins 663ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 664ab45ba71SJames Collins $html .= $item; 665ab45ba71SJames Collins } 666ab45ba71SJames Collins 667ab45ba71SJames Collins $html .= '</div>'; 668ab45ba71SJames Collins $html .= '</li>'; 669ab45ba71SJames Collins 670a8eebd82SJames Collins $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">'; 6719cff245bSJames Collins $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button" 6729cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6739cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('user') : '') . 6749cff245bSJames Collins ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' . 6759cff245bSJames Collins $lang['user_tools'] . '</span>') . '</a>'; 676a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 677ab45ba71SJames Collins 678ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 679ab45ba71SJames Collins $html .= $item; 680ab45ba71SJames Collins } 681ab45ba71SJames Collins 682ab45ba71SJames Collins $html .= '</div>'; 683ab45ba71SJames Collins $html .= '</li>'; 684ab45ba71SJames Collins 685ab45ba71SJames Collins break; 686ab45ba71SJames Collins 687ab45ba71SJames Collins case 'combine': 688ab45ba71SJames Collins $html .= '<li class="mikio-nav-dropdown">'; 6899cff245bSJames Collins $html .= '<a class="mikio-nav-link" href="#">' . 6909cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') . 6919cff245bSJames Collins ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' . 6929cff245bSJames Collins tpl_getLang('tools-menu') . '</span>') . '</a>'; 693a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 694ab45ba71SJames Collins 695ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>'; 696ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 697ab45ba71SJames Collins $html .= $item; 698ab45ba71SJames Collins } 699ab45ba71SJames Collins 700ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 701ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>'; 702ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 703ab45ba71SJames Collins $html .= $item; 704ab45ba71SJames Collins } 705ab45ba71SJames Collins 706ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 707ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>'; 708ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 709ab45ba71SJames Collins $html .= $item; 710ab45ba71SJames Collins } 711ab45ba71SJames Collins 712ab45ba71SJames Collins $html .= '</div>'; 713ab45ba71SJames Collins $html .= '</li>'; 714ab45ba71SJames Collins break; 715ab45ba71SJames Collins 716ab45ba71SJames Collins default: // seperate 717ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 718a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 719ab45ba71SJames Collins } 720ab45ba71SJames Collins 721ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 722a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 723a8eebd82SJames Collins } 724a8eebd82SJames Collins 725a8eebd82SJames Collins foreach ($userToolsMenu as $item) { 726a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 727ab45ba71SJames Collins } 728ab45ba71SJames Collins 729ab45ba71SJames Collins break; 7309cff245bSJames Collins }//end switch 731ab45ba71SJames Collins 7323a3ece10SJames Collins $translation = plugin_load('helper', 'translation'); 7333a3ece10SJames Collins if ($translation !== null) { 7343a3ece10SJames Collins $html .= '<li id="mikio__translate" class="mikio-nav-dropdown">'; 7353a3ece10SJames Collins $html .= '<a id="mikio_dropdown_translate" class="nav-link dropdown-toggle" href="#" role="button" 7363a3ece10SJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 7373a3ece10SJames Collins $this->mikioInlineIcon('language') . 7383a3ece10SJames Collins '</a>'; 7393a3ece10SJames Collins $html .= '<div class="mikio-dropdown closed">'; 7403a3ece10SJames Collins 7413a3ece10SJames Collins $html .= $translation->showTranslations(); 7423a3ece10SJames Collins 7433a3ece10SJames Collins $html .= '</div>'; 7443a3ece10SJames Collins $html .= '</li>'; 7453a3ece10SJames Collins } 7463a3ece10SJames Collins 74712030b10SJames Collins if ($this->getConf('showLightDark') === true) { 748d0fba6d1SJames Collins $autoLightDark = $this->getConf('autoLightDark'); 7499e41d878SJames Collins $html .= '<li class="mikio-darklight"> 7509e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' . 751d0fba6d1SJames Collins ($autoLightDark === true ? $this->mikioInlineIcon('sunmoon', 'mikio-darklight-auto') : '') . 7529e41d878SJames Collins $this->mikioInlineIcon('sun', 'mikio-darklight-light') . 7539e41d878SJames Collins $this->mikioInlineIcon('moon', 'mikio-darklight-dark') . 7549e41d878SJames Collins '</a></li>'; 75512030b10SJames Collins } 75612030b10SJames Collins 757ab45ba71SJames Collins $html .= '</ul>'; 758ab45ba71SJames Collins 7599cff245bSJames Collins if ($print === true) { 7609cff245bSJames Collins echo $html; 7619cff245bSJames Collins } 762a8eebd82SJames Collins return $html; 763a8eebd82SJames Collins } 764a8eebd82SJames Collins 765a8eebd82SJames Collins 766a8eebd82SJames Collins /** 767a8eebd82SJames Collins * Create a nav element from a string. <uri>|<title>; 768a8eebd82SJames Collins * 7699cff245bSJames Collins * @param string $str String to generate nav. 770a8eebd82SJames Collins * @return string nav elements generated 771a8eebd82SJames Collins */ 7729cff245bSJames Collins public function stringToNav(string $str) 77310b40067Snomadjimbob { 774a8eebd82SJames Collins $html = ''; 775a8eebd82SJames Collins 7763a385f2cSJames Collins if (empty($str) === false) { 777a8eebd82SJames Collins $items = explode(';', $str); 778a8eebd82SJames Collins if (count($items) > 0) { 779a8eebd82SJames Collins $html .= '<ul class="mikio-nav">'; 780a8eebd82SJames Collins foreach ($items as $item) { 781a8eebd82SJames Collins $parts = explode('|', $item); 782a8eebd82SJames Collins if ($parts > 1) { 7839cff245bSJames Collins $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' . 7849cff245bSJames Collins strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) . 7859cff245bSJames Collins '</a></li>'; 786a8eebd82SJames Collins } 787a8eebd82SJames Collins } 788a8eebd82SJames Collins $html .= '</ul>'; 789a8eebd82SJames Collins } 7902b4583abSJames Collins } 7912b4583abSJames Collins 792ab45ba71SJames Collins return $html; 7932b4583abSJames Collins } 7942b4583abSJames Collins 795a8eebd82SJames Collins /** 796ab45ba71SJames Collins * print or return the main navbar 7972b4583abSJames Collins * 7989cff245bSJames Collins * @param boolean $print Print the navbar. 7999cff245bSJames Collins * @param boolean $showSub Include the sub navbar. 800ab45ba71SJames Collins * @return string generated content 8012b4583abSJames Collins */ 8029cff245bSJames Collins public function includeNavbar(bool $print = true, bool $showSub = false) 80310b40067Snomadjimbob { 804b39ad16dSJames Collins global $conf, $USERINFO; 805d3d7d2b7SJames Collins 806d3d7d2b7SJames Collins $homeUrl = wl(); 807d3d7d2b7SJames Collins 8089cff245bSJames Collins if (plugin_isdisabled('showpageafterlogin') === false) { 809d3d7d2b7SJames Collins $p = &plugin_load('action', 'showpageafterlogin'); 8103a385f2cSJames Collins if (empty($p) === false) { 8119cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 812d3d7d2b7SJames Collins $homeUrl = wl($p->getConf('page_after_login')); 813d3d7d2b7SJames Collins } 814d3d7d2b7SJames Collins } 815b39ad16dSJames Collins } else { 8169cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 817b39ad16dSJames Collins $url = $this->getConf('brandURLUser'); 818b39ad16dSJames Collins if (strlen($url) > 0) { 819b39ad16dSJames Collins $homeUrl = $url; 820d3d7d2b7SJames Collins } 821b39ad16dSJames Collins } else { 822b39ad16dSJames Collins $url = $this->getConf('brandURLGuest'); 823b39ad16dSJames Collins if (strlen($url) > 0) { 824b39ad16dSJames Collins $homeUrl = $url; 825b39ad16dSJames Collins } 826b39ad16dSJames Collins } 827b39ad16dSJames Collins } 828d3d7d2b7SJames Collins 829ab45ba71SJames Collins $html = ''; 83047161538SJames Collins 8319cff245bSJames Collins $html .= '<nav class="mikio-navbar' . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') . 8329cff245bSJames Collins '">'; 833f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 834d3d7d2b7SJames Collins $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">'; 8359cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) { 836ab45ba71SJames Collins // Brand image 8379cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true) { 8389cff245bSJames Collins $logo = $this->getMediaFile('logo', false); 8399cff245bSJames Collins ; 8403a385f2cSJames Collins if (empty($logo) === false) { 841f0241fc4SJames Collins $width = $this->getConf('navbarTitleIconWidth'); 842f0241fc4SJames Collins $height = $this->getConf('navbarTitleIconHeight'); 843f0241fc4SJames Collins $styles = ''; 844f0241fc4SJames Collins 845f0241fc4SJames Collins if (strlen($width) > 0 || strlen($height) > 0) { 8469cff245bSJames Collins if (ctype_digit($width) === true) { 847f0241fc4SJames Collins $styles .= 'max-width:' . intval($width) . 'px;'; 8489cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) { 849f0241fc4SJames Collins $styles .= 'max-width:' . $width . ';'; 8509cff245bSJames Collins } elseif (strcasecmp($width, 'none') === 0) { 8517a92c19bSJames Collins $styles .= 'max-width:none;'; 852f0241fc4SJames Collins } 853f0241fc4SJames Collins 8549cff245bSJames Collins if (ctype_digit($height) === true) { 855f0241fc4SJames Collins $styles .= 'max-height:' . intval($height) . 'px;'; 8569cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) { 857f0241fc4SJames Collins $styles .= 'max-height:' . $height . ';'; 8589cff245bSJames Collins } elseif (strcasecmp($height, 'none') === 0) { 8597a92c19bSJames Collins $styles .= 'max-height:none;'; 860f0241fc4SJames Collins } 861f0241fc4SJames Collins 862f0241fc4SJames Collins if (strlen($styles) > 0) { 863f0241fc4SJames Collins $styles = ' style="' . $styles . '"'; 864f0241fc4SJames Collins } 8659cff245bSJames Collins }//end if 866f0241fc4SJames Collins 867f0241fc4SJames Collins $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>'; 8689cff245bSJames Collins }//end if 8699cff245bSJames Collins }//end if 870ab45ba71SJames Collins 871ab45ba71SJames Collins // Brand title 8729cff245bSJames Collins if ($this->getConf('navbarUseTitleText') === true) { 873ab45ba71SJames Collins $html .= '<div class="mikio-navbar-brand-title">'; 874a8eebd82SJames Collins $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>'; 8759cff245bSJames Collins if ($this->getConf('navbarUseTaglineText') === true) { 876a8eebd82SJames Collins $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>'; 877ab45ba71SJames Collins } 878ab45ba71SJames Collins $html .= '</div>'; 879ab45ba71SJames Collins } 8809cff245bSJames Collins }//end if 881ab45ba71SJames Collins $html .= '</a>'; 882660b2c71SJames Collins $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>'; 883ab45ba71SJames Collins 884ab45ba71SJames Collins // Menus 885ab45ba71SJames Collins $html .= '<div class="mikio-navbar-collapse">'; 886ab45ba71SJames Collins 8879cff245bSJames Collins $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'), 8889cff245bSJames Collins $this->getConf('navbarPosRight', 'none') 8899cff245bSJames Collins ]; 890a8eebd82SJames Collins foreach ($menus as $menuType) { 891a8eebd82SJames Collins switch ($menuType) { 892a8eebd82SJames Collins case 'custom': 893a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', '')); 894a8eebd82SJames Collins break; 895a8eebd82SJames Collins case 'search': 896ab45ba71SJames Collins $html .= '<div class="mikio-nav-item">'; 897ab45ba71SJames Collins $html .= $this->includeSearch(false); 898ab45ba71SJames Collins $html .= '</div>'; 899a8eebd82SJames Collins break; 900a8eebd82SJames Collins case 'dokuwiki': 9019cff245bSJames Collins $html .= $this->includeDWMenu(false); 902a8eebd82SJames Collins break; 903a8eebd82SJames Collins } 904a8eebd82SJames Collins } 905ab45ba71SJames Collins 906ab45ba71SJames Collins $html .= '</div>'; 907f8039bf2SJames Collins $html .= '</div>'; 908ab45ba71SJames Collins $html .= '</nav>'; 909ab45ba71SJames Collins 910a8eebd82SJames Collins // Sub Navbar 9119cff245bSJames Collins if ($showSub === true) { 9129cff245bSJames Collins $sub = $this->includePage('submenu', false); 9133a385f2cSJames Collins if (empty($sub) === false) { 9149cff245bSJames Collins $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>'; 9159cff245bSJames Collins } 916ab45ba71SJames Collins } 917ab45ba71SJames Collins 9189cff245bSJames Collins if ($print === true) { 9199cff245bSJames Collins echo $html; 9209cff245bSJames Collins } 921ab45ba71SJames Collins return $html; 922ab45ba71SJames Collins } 923ab45ba71SJames Collins 924ab45ba71SJames Collins 925a8eebd82SJames Collins /** 926a8eebd82SJames Collins * Is there a sidebar 927a8eebd82SJames Collins * 9289cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 929a8eebd82SJames Collins * @return boolean if sidebar exists 930a8eebd82SJames Collins */ 9319cff245bSJames Collins public function sidebarExists(string $prefix = '') 93210b40067Snomadjimbob { 933a8eebd82SJames Collins global $conf; 934a8eebd82SJames Collins 9353a385f2cSJames Collins if (strcasecmp($prefix, 'left') === 0) { 9369cff245bSJames Collins $prefix = ''; 9379cff245bSJames Collins } 938a8eebd82SJames Collins 939a8eebd82SJames Collins return $this->pageExists($conf['sidebar' . $prefix]); 940a8eebd82SJames Collins } 941a8eebd82SJames Collins 942a8eebd82SJames Collins 943a8eebd82SJames Collins /** 944ab45ba71SJames Collins * Print or return the sidebar content 945ab45ba71SJames Collins * 9469cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 9479cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 9489cff245bSJames Collins * @param boolean $parse Parse the content. 949ab45ba71SJames Collins * @return string generated content 950ab45ba71SJames Collins */ 9519cff245bSJames Collins public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true) 95210b40067Snomadjimbob { 953ab45ba71SJames Collins global $conf, $ID; 954ab45ba71SJames Collins 955ab45ba71SJames Collins $html = ''; 956ab45ba71SJames Collins $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix)); 957ab45ba71SJames Collins $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix)); 958ab45ba71SJames Collins 9593a385f2cSJames Collins if (empty($confPrefix) === true) { 9609cff245bSJames Collins $confPrefix = 'Left'; 9619cff245bSJames Collins } 9621cdedf28SJames Collins if (strcasecmp($prefix, 'left') === 0) { 9639cff245bSJames Collins $prefix = ''; 9649cff245bSJames Collins } 965ab45ba71SJames Collins 9661cdedf28SJames Collins $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar']; 967ab45ba71SJames Collins 9689cff245bSJames Collins if ( 9699cff245bSJames Collins $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false && 9701cdedf28SJames Collins p_get_metadata($ID, 'nosidebar', false) === null 9719cff245bSJames Collins ) { 9729cff245bSJames Collins $content = $this->includePage($sidebarPage . 'header', false); 9733a385f2cSJames Collins if (empty($content) === false) { 9749cff245bSJames Collins $html .= '<div class="mikio-sidebar-header">' . $content . '</div>'; 9759cff245bSJames Collins } 976ab45ba71SJames Collins 9773a385f2cSJames Collins if (empty($prefix) === true) { 9789cff245bSJames Collins $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'), 9799cff245bSJames Collins $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4') 9809cff245bSJames Collins ]; 981ab45ba71SJames Collins 982a8eebd82SJames Collins foreach ($rows as $row) { 983a8eebd82SJames Collins switch ($row) { 984a8eebd82SJames Collins case 'search': 9859cff245bSJames Collins $html .= $this->includeSearch(false); 986a8eebd82SJames Collins break; 987a8eebd82SJames Collins case 'logged in user': 9889cff245bSJames Collins $html .= $this->includeLoggedIn(false); 989a8eebd82SJames Collins break; 990a8eebd82SJames Collins case 'content': 9919cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 9923a385f2cSJames Collins if (empty($content) === false) { 9939cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 9949cff245bSJames Collins } 995a8eebd82SJames Collins break; 996a8eebd82SJames Collins case 'tags': 997a8eebd82SJames Collins $html .= '<div class="mikio-tags"></div>'; 998a8eebd82SJames Collins } 999a8eebd82SJames Collins } 1000a8eebd82SJames Collins } else { 10019cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 10023a385f2cSJames Collins if (empty($content) === false) { 10039cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 10049cff245bSJames Collins } 10059cff245bSJames Collins }//end if 10069cff245bSJames Collins 10079cff245bSJames Collins $content = $this->includePage($sidebarPage . 'footer', false); 10083a385f2cSJames Collins if (empty($content) === false) { 10099cff245bSJames Collins $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>'; 10109cff245bSJames Collins } 10119cff245bSJames Collins }//end if 10129cff245bSJames Collins 10133a385f2cSJames Collins if (empty($html) === true) { 10143a385f2cSJames Collins if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) { 10159cff245bSJames Collins $html = ' '; 10169cff245bSJames Collins } 10179cff245bSJames Collins if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) { 10189cff245bSJames Collins $html = ' '; 10199cff245bSJames Collins } 1020a8eebd82SJames Collins } 1021ab45ba71SJames Collins 10223a385f2cSJames Collins if (empty($html) === false) { 10231cdedf28SJames Collins $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) . 10249cff245bSJames Collins '"><a class="mikio-sidebar-toggle' . 10259cff245bSJames Collins ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' . 10269cff245bSJames Collins tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' . 10279cff245bSJames Collins $html . '</div></aside>'; 1028ab45ba71SJames Collins } 1029ab45ba71SJames Collins 10309cff245bSJames Collins if ($parse === true) { 10319cff245bSJames Collins $html = $this->includeIcons($html); 10323a04a100SJames Collins } 10339cff245bSJames Collins if ($print === true) { 10349cff245bSJames Collins echo $html; 1035ab45ba71SJames Collins } 10364f8225e4SJames Collins 1037ab45ba71SJames Collins return $html; 1038ab45ba71SJames Collins } 1039ab45ba71SJames Collins 1040ab45ba71SJames Collins 1041a8eebd82SJames Collins /** 1042ab45ba71SJames Collins * Print or return the page tools content 1043ab45ba71SJames Collins * 10449cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 10459cff245bSJames Collins * @param boolean $includeId Include the dw__pagetools id in the element. 1046ab45ba71SJames Collins * @return string generated content 1047ab45ba71SJames Collins */ 10489cff245bSJames Collins public function includePageTools(bool $print = true, bool $includeId = false) 104910b40067Snomadjimbob { 10501293ce10SJames Collins global $USERINFO; 10511293ce10SJames Collins 10529cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 1053ab45ba71SJames Collins $html = ''; 1054ab45ba71SJames Collins 10559cff245bSJames Collins $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">'; 1056b9c0582bSJames Collins $html .= '<ul class="tools">'; 1057ab45ba71SJames Collins 1058ab45ba71SJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 1059ab45ba71SJames Collins foreach ($items as $item) { 10609cff245bSJames Collins $classes = []; 10613fd763a0SJames Collins $classes[] = $item->getType(); 10623fd763a0SJames Collins $attr = $item->getLinkAttributes(); 10633fd763a0SJames Collins 10649cff245bSJames Collins if (empty($attr['class']) === false) { 10653fd763a0SJames Collins $classes = array_merge($classes, explode(' ', $attr['class'])); 1066ab45ba71SJames Collins } 1067ab45ba71SJames Collins 10683fd763a0SJames Collins $classes = array_unique($classes); 1069*fd16ea41SJames Collins $title = isset($attr['title']) && $attr['title'] !== 0 ? $attr['title'] : $item->getTitle(); 10703fd763a0SJames Collins 1071f02b8ab5SJames Collins $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType()), 'always'); 10729cff245bSJames Collins if ( 10733a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 10743a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 10753a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true)) 10769cff245bSJames Collins ) { 10773fd763a0SJames Collins $html .= '<li class="' . implode(' ', $classes) . '">'; 10789cff245bSJames Collins $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' . 1079*fd16ea41SJames Collins $title . '"' . (isset($attr['accesskey']) && $attr['accesskey'] !== '' ? ' accesskey="' . $attr['accesskey'] . '"' : '') . '><div class="icon">' . inlineSVG($item->getSvg()) . 10809cff245bSJames Collins '</div><span class="a11y">' . $item->getLabel() . '</span></a>'; 10813fd763a0SJames Collins $html .= '</li>'; 10823fd763a0SJames Collins } 10839cff245bSJames Collins }//end foreach 10843fd763a0SJames Collins 10853fd763a0SJames Collins $html .= '</ul>'; 1086ab45ba71SJames Collins $html .= '</nav>'; 1087ab45ba71SJames Collins 10889cff245bSJames Collins if ($print === true) { 10899cff245bSJames Collins echo $html; 10909cff245bSJames Collins } 1091ab45ba71SJames Collins return $html; 1092ab45ba71SJames Collins } 1093ab45ba71SJames Collins 1094ab45ba71SJames Collins 1095a8eebd82SJames Collins /** 1096a8eebd82SJames Collins * Print or return the search bar 1097a8eebd82SJames Collins * 10989cff245bSJames Collins * @param boolean $print Print content. 1099a8eebd82SJames Collins * @return string contents of the search bar 1100a8eebd82SJames Collins */ 11019cff245bSJames Collins public function includeSearch(bool $print = true) 110210b40067Snomadjimbob { 11039cff245bSJames Collins global $lang, $ID, $ACT, $QUERY; 1104ab45ba71SJames Collins $html = ''; 1105ab45ba71SJames Collins 11069cff245bSJames Collins $html .= '<form class="mikio-search search" action="' . wl() . 11079cff245bSJames Collins '" accept-charset="utf-8" method="get" role="search">'; 1108a8eebd82SJames Collins $html .= '<input type="hidden" name="do" value="search">'; 1109a8eebd82SJames Collins $html .= '<input type="hidden" name="id" value="' . $ID . '">'; 1110c1cb9f15SChris MacMackin $html .= '<input name="q" '; 11119cff245bSJames Collins if ($this->getConf('searchUseTypeahead') === true) { 1112c1cb9f15SChris MacMackin $html .= 'class="search_typeahead" '; 1113c1cb9f15SChris MacMackin } 11149cff245bSJames Collins $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' . 11153a385f2cSJames Collins ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />'; 1116a8eebd82SJames Collins $html .= '<button type="submit" title="' . $lang['btn_search'] . '">'; 11173a385f2cSJames Collins if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) { 1118a8eebd82SJames Collins $html .= $this->mikioInlineIcon('search'); 1119ab45ba71SJames Collins } else { 1120ab45ba71SJames Collins $html .= $lang['btn_search']; 1121ab45ba71SJames Collins } 1122ab45ba71SJames Collins $html .= '</button>'; 1123ab45ba71SJames Collins $html .= '</form>'; 1124ab45ba71SJames Collins 11259cff245bSJames Collins if ($print === true) { 11269cff245bSJames Collins echo $html; 11279cff245bSJames Collins } 1128ab45ba71SJames Collins return $html; 1129ab45ba71SJames Collins } 1130ab45ba71SJames Collins 1131ab45ba71SJames Collins 1132a8eebd82SJames Collins /** 1133a8eebd82SJames Collins * Print or return content 1134a8eebd82SJames Collins * 11359cff245bSJames Collins * @param boolean $print Print content. 1136a8eebd82SJames Collins * @return string contents 1137a8eebd82SJames Collins */ 11389cff245bSJames Collins public function includeContent(bool $print = true) 113910b40067Snomadjimbob { 1140ab45ba71SJames Collins ob_start(); 11419cff245bSJames Collins tpl_content(false); 1142ab45ba71SJames Collins $html = ob_get_contents(); 1143ab45ba71SJames Collins ob_end_clean(); 1144ab45ba71SJames Collins 1145ab45ba71SJames Collins $html = $this->includeIcons($html); 1146ab45ba71SJames Collins $html = $this->parseContent($html); 1147ab45ba71SJames Collins 1148ab45ba71SJames Collins $html .= '<div style="clear:both"></div>'; 1149ab45ba71SJames Collins 11509cff245bSJames Collins if ($this->getConf('heroTitle') === false) { 11519cff245bSJames Collins $html = '<div class="mikio-tags"></div>' . $html; 11529cff245bSJames Collins } 1153a8eebd82SJames Collins 1154a8eebd82SJames Collins $html = '<div class="mikio-article-content">' . $html . '</div>'; 1155a8eebd82SJames Collins 11569cff245bSJames Collins if ($print === true) { 11579cff245bSJames Collins echo $html; 11589cff245bSJames Collins } 1159ab45ba71SJames Collins return $html; 1160ab45ba71SJames Collins } 1161ab45ba71SJames Collins 1162daf2cd7aSJames Collins private function custom_tpl_pageinfo($ret = false) 1163daf2cd7aSJames Collins { 1164daf2cd7aSJames Collins global $conf; 1165daf2cd7aSJames Collins global $lang; 1166daf2cd7aSJames Collins global $INFO; 1167daf2cd7aSJames Collins global $ID; 1168daf2cd7aSJames Collins 1169daf2cd7aSJames Collins // return if we are not allowed to view the page 1170daf2cd7aSJames Collins if (!auth_quickaclcheck($ID)) { 1171daf2cd7aSJames Collins return false; 1172daf2cd7aSJames Collins } 1173daf2cd7aSJames Collins 1174daf2cd7aSJames Collins if ($INFO['exists']) { 1175daf2cd7aSJames Collins $file = $INFO['filepath']; 1176daf2cd7aSJames Collins if (!$conf['fullpath']) { 1177daf2cd7aSJames Collins if ($INFO['rev']) { 1178daf2cd7aSJames Collins $file = str_replace($conf['olddir'] . '/', '', $file); 1179daf2cd7aSJames Collins } else { 1180daf2cd7aSJames Collins $file = str_replace($conf['datadir'] . '/', '', $file); 1181daf2cd7aSJames Collins } 1182daf2cd7aSJames Collins } 1183daf2cd7aSJames Collins $file = utf8_decodeFN($file); 1184daf2cd7aSJames Collins $date = dformat($INFO['lastmod']); 1185daf2cd7aSJames Collins 1186daf2cd7aSJames Collins $string = $this->getConf('footerPageInfoText', ''); 1187daf2cd7aSJames Collins 1188daf2cd7aSJames Collins // replace lang items 1189daf2cd7aSJames Collins $string = preg_replace_callback('/%([^%]+)%/', function ($matches) use ($lang) { 1190daf2cd7aSJames Collins return isset($lang[$matches[1]]) ? $lang[$matches[1]] : ''; 1191daf2cd7aSJames Collins }, $string); 1192daf2cd7aSJames Collins 1193daf2cd7aSJames Collins $options = [ 1194daf2cd7aSJames Collins 'file' => '<bdi>' . $file . '</bdi>', 1195daf2cd7aSJames Collins 'date' => $date, 1196daf2cd7aSJames Collins 'user' => $INFO['editor'] ? '<bdi>' . editorinfo($INFO['editor']) . '</bdi>' : $lang['external_edit'] 1197daf2cd7aSJames Collins ]; 1198daf2cd7aSJames Collins 1199daf2cd7aSJames Collins if (!empty($_SERVER['REMOTE_USER'])) { 1200daf2cd7aSJames Collins $options['loggedin'] = true; 1201daf2cd7aSJames Collins } 1202daf2cd7aSJames Collins 1203daf2cd7aSJames Collins if ($INFO['locked']) { 1204daf2cd7aSJames Collins $options['locked'] = '<bdi>' . editorinfo($INFO['locked']) . '</bdi>'; 1205daf2cd7aSJames Collins } 1206daf2cd7aSJames Collins 1207daf2cd7aSJames Collins $parser = new \ParensParser(); 1208daf2cd7aSJames Collins $result = $parser->parse($string); 1209daf2cd7aSJames Collins 1210daf2cd7aSJames Collins $parserIterate = function ($arr, $func) use ($options) { 1211daf2cd7aSJames Collins $str = ''; 1212daf2cd7aSJames Collins 1213daf2cd7aSJames Collins foreach ($arr as $value) { 1214daf2cd7aSJames Collins if (is_array($value)) { 1215daf2cd7aSJames Collins $str .= $func($value, $func); 1216daf2cd7aSJames Collins } else { 1217daf2cd7aSJames Collins if (preg_match('/^([a-zA-Z]+)=(.*)/', $value, $matches)) { 1218daf2cd7aSJames Collins $key = strtolower($matches[1]); // Extract the key (a-zA-Z part) 1219daf2cd7aSJames Collins 1220daf2cd7aSJames Collins if (isset($options[$key])) { 1221daf2cd7aSJames Collins $str .= $matches[2]; 1222daf2cd7aSJames Collins } else { 1223daf2cd7aSJames Collins return $str; 1224daf2cd7aSJames Collins } 1225daf2cd7aSJames Collins } else { 1226daf2cd7aSJames Collins $str .= $value; 1227daf2cd7aSJames Collins } 1228daf2cd7aSJames Collins } 1229daf2cd7aSJames Collins }//end foreach 1230daf2cd7aSJames Collins 1231daf2cd7aSJames Collins return $str; 1232daf2cd7aSJames Collins }; 1233daf2cd7aSJames Collins 1234daf2cd7aSJames Collins $string = $parserIterate($result, $parserIterate); 1235daf2cd7aSJames Collins 1236daf2cd7aSJames Collins $string = preg_replace_callback('/{([^}]+)}/', function ($matches) use ($options) { 1237daf2cd7aSJames Collins $key = strtolower($matches[1]); 1238daf2cd7aSJames Collins return isset($options[$key]) ? $options[$key] : ''; 1239daf2cd7aSJames Collins }, $string); 1240daf2cd7aSJames Collins 1241daf2cd7aSJames Collins if ($ret) { 1242daf2cd7aSJames Collins return $string; 1243daf2cd7aSJames Collins } else { 1244daf2cd7aSJames Collins echo $string; 1245daf2cd7aSJames Collins return true; 1246daf2cd7aSJames Collins } 1247daf2cd7aSJames Collins }//end if 1248daf2cd7aSJames Collins 1249daf2cd7aSJames Collins return false; 1250daf2cd7aSJames Collins } 1251daf2cd7aSJames Collins 1252a8eebd82SJames Collins /** 1253ab45ba71SJames Collins * Print or return footer 1254ab45ba71SJames Collins * 12559cff245bSJames Collins * @param boolean $print Print footer. 12569cff245bSJames Collins * @return string HTML string containing footer 1257ab45ba71SJames Collins */ 12589cff245bSJames Collins public function includeFooter(bool $print = true) 125910b40067Snomadjimbob { 1260ab45ba71SJames Collins global $ACT; 1261ab45ba71SJames Collins 1262ab45ba71SJames Collins $html = ''; 1263ab45ba71SJames Collins 1264ab45ba71SJames Collins $html .= '<footer class="mikio-footer">'; 1265daf2cd7aSJames Collins $html .= '<div class="doc">' . $this->custom_tpl_pageinfo(true) . '</div>'; 12669cff245bSJames Collins $html .= $this->includePage('footer', false); 1267ab45ba71SJames Collins 1268a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('footerCustomMenuText')); 1269ab45ba71SJames Collins 12709cff245bSJames Collins if ($this->getConf('footerSearch') === true) { 1271ab45ba71SJames Collins $html .= '<div class="mikio-footer-search">'; 12729cff245bSJames Collins $html .= $this->includeSearch(false); 1273ab45ba71SJames Collins $html .= '</div>'; 1274ab45ba71SJames Collins } 1275ab45ba71SJames Collins 1276a8eebd82SJames Collins $showPageTools = $this->getConf('pageToolsFooter'); 12779cff245bSJames Collins if ( 12783a385f2cSJames Collins strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 || 12793a385f2cSJames Collins $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0) 12809cff245bSJames Collins ) { 12819cff245bSJames Collins $html .= $this->includePageTools(false); 12829cff245bSJames Collins } 1283ab45ba71SJames Collins 12849cff245bSJames Collins $meta['licenseType'] = ['multichoice', '_choices' => ['none', 'badge', 'button']]; 12859cff245bSJames Collins $meta['licenseImageOnly'] = ['onoff']; 1286ab45ba71SJames Collins 1287ab45ba71SJames Collins $licenseType = $this->getConf('licenseType'); 12889cff245bSJames Collins if ($licenseType !== 'none') { 12899cff245bSJames Collins $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true); 1290ab45ba71SJames Collins } 1291ab45ba71SJames Collins 1292ab45ba71SJames Collins $html .= '</footer>'; 1293ab45ba71SJames Collins 12949cff245bSJames Collins if ($print === true) { 12959cff245bSJames Collins echo $html; 12969cff245bSJames Collins } 1297ab45ba71SJames Collins return $html; 1298ab45ba71SJames Collins } 1299ab45ba71SJames Collins 1300ab45ba71SJames Collins 1301a8eebd82SJames Collins /** 1302ab45ba71SJames Collins * Print or return breadcrumb trail 1303ab45ba71SJames Collins * 13049cff245bSJames Collins * @param boolean $print Print out trail. 13059cff245bSJames Collins * @param boolean $parse Parse trail before printing. 13069cff245bSJames Collins * @return string HTML string containing breadcrumbs 1307ab45ba71SJames Collins */ 13089cff245bSJames Collins public function includeBreadcrumbs(bool $print = true, bool $parse = true) 130910b40067Snomadjimbob { 1310a8eebd82SJames Collins global $conf, $ID, $lang, $ACT; 1311a8eebd82SJames Collins 13123a385f2cSJames Collins if ( 13133a385f2cSJames Collins $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 && 131495372bffSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0 13153a385f2cSJames Collins ) { 13169cff245bSJames Collins return ''; 13179cff245bSJames Collins } 1318ab45ba71SJames Collins 1319ab45ba71SJames Collins $html = '<div class="mikio-breadcrumbs">'; 1320f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 13213a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 132295372bffSJames Collins if ($conf['breadcrumbs'] !== 0) { 13239cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) { 1324ab45ba71SJames Collins ob_start(); 132575adba86SJames Collins tpl_breadcrumbs(); 1326ab45ba71SJames Collins $html .= ob_get_contents(); 1327ab45ba71SJames Collins ob_end_clean(); 1328ab45ba71SJames Collins } else { 1329ab45ba71SJames Collins $sep = '•'; 1330ab45ba71SJames Collins $prefix = $lang['breadcrumb']; 1331ab45ba71SJames Collins 13329cff245bSJames Collins if ($this->getConf('breadcrumbSep') === true) { 1333ab45ba71SJames Collins $sep = $this->getConf('breadcrumbSepText'); 13349cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-sep', false); 1335ab45ba71SJames Collins 13369cff245bSJames Collins if ($img !== false) { 1337ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1338ab45ba71SJames Collins } 133947161538SJames Collins } 134047161538SJames Collins 13419cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === true) { 1342ab45ba71SJames Collins $prefix = $this->getConf('breadcrumbPrefixText'); 13439cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-prefix', false); 1344ab45ba71SJames Collins 13459cff245bSJames Collins if ($img !== false) { 1346ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 1347ab45ba71SJames Collins } 1348ab45ba71SJames Collins } 1349ab45ba71SJames Collins 1350ab45ba71SJames Collins $crumbs = breadcrumbs(); 1351ab45ba71SJames Collins 1352ab45ba71SJames Collins $html .= '<ul>'; 13533a385f2cSJames Collins if (empty($prefix) === false) { 13549cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 13559cff245bSJames Collins } 1356ab45ba71SJames Collins 1357ab45ba71SJames Collins $last = count($crumbs); 1358ab45ba71SJames Collins $i = 0; 1359ab45ba71SJames Collins foreach ($crumbs as $id => $name) { 1360ab45ba71SJames Collins $i++; 136195372bffSJames Collins if ($i !== 1) { 1362ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 136395372bffSJames Collins } 13649cff245bSJames Collins $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>'; 13659cff245bSJames Collins $html .= tpl_pagelink($id, null, true); 1366ab45ba71SJames Collins $html .= '</li>'; 1367ab45ba71SJames Collins } 1368ab45ba71SJames Collins 1369ab45ba71SJames Collins $html .= '</ul>'; 13709cff245bSJames Collins }//end if 13719cff245bSJames Collins }//end if 13729cff245bSJames Collins }//end if 13733d11a778SJames Collins 13743d11a778SJames Collins $html .= '</div>'; 13753d11a778SJames Collins $html .= '</div>'; 13763d11a778SJames Collins 13779cff245bSJames Collins if ($parse === true) { 13789cff245bSJames Collins $html = $this->includeIcons($html); 13799cff245bSJames Collins } 13809cff245bSJames Collins if ($print === true) { 13819cff245bSJames Collins echo $html; 13829cff245bSJames Collins } 13833d11a778SJames Collins return $html; 13843d11a778SJames Collins } 13853d11a778SJames Collins 13863d11a778SJames Collins /** 13873d11a778SJames Collins * Print or return you are here trail 13883d11a778SJames Collins * 13899cff245bSJames Collins * @param boolean $print Print out trail. 13909cff245bSJames Collins * @param boolean $parse Parse trail before printing. 13919cff245bSJames Collins * @return string HTML string containing breadcrumbs 13923d11a778SJames Collins */ 13939cff245bSJames Collins public function includeYouAreHere(bool $print = true, bool $parse = true) 13943d11a778SJames Collins { 13953d11a778SJames Collins global $conf, $ID, $lang, $ACT; 13963d11a778SJames Collins 13973a385f2cSJames Collins if ( 13983a385f2cSJames Collins $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 && 139995372bffSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0 14003a385f2cSJames Collins ) { 14019cff245bSJames Collins return ''; 14029cff245bSJames Collins } 14033d11a778SJames Collins 14043d11a778SJames Collins $html = '<div class="mikio-youarehere">'; 14053d11a778SJames Collins $html .= '<div class="mikio-container">'; 14063a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 140795372bffSJames Collins if ($conf['youarehere'] !== 0) { 14089cff245bSJames Collins if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) { 140995372bffSJames Collins $html .= '<div class="mikio-bcdw">'; 1410ab45ba71SJames Collins ob_start(); 141175adba86SJames Collins tpl_youarehere(); 1412ab45ba71SJames Collins $html .= ob_get_contents(); 1413ab45ba71SJames Collins ob_end_clean(); 141495372bffSJames Collins $html .= '</div>'; 1415ab45ba71SJames Collins } else { 1416ab45ba71SJames Collins $sep = ' » '; 1417ab45ba71SJames Collins $prefix = $lang['youarehere']; 1418ab45ba71SJames Collins 14199cff245bSJames Collins if ($this->getConf('youarehereSep') === true) { 14203d11a778SJames Collins $sep = $this->getConf('youarehereSepText'); 14219cff245bSJames Collins $img = $this->getMediaFile('youarehere-sep', false); 1422ab45ba71SJames Collins 14239cff245bSJames Collins if ($img !== false) { 1424ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1425ab45ba71SJames Collins } 142675adba86SJames Collins } 142775adba86SJames Collins 14289cff245bSJames Collins if ($this->getConf('youareherePrefix') === true) { 14293d11a778SJames Collins $prefix = $this->getConf('youareherePrefixText'); 14309cff245bSJames Collins $img = $this->getMediaFile('youarehere-prefix', false); 1431ab45ba71SJames Collins 14329cff245bSJames Collins if ($img !== false) { 1433ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 143475adba86SJames Collins } 143547161538SJames Collins } 143647161538SJames Collins 1437ab45ba71SJames Collins $html .= '<ul>'; 14383a385f2cSJames Collins if (empty($prefix) === false) { 14399cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 14409cff245bSJames Collins } 14419cff245bSJames Collins $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>'; 1442ab45ba71SJames Collins 1443ab45ba71SJames Collins $parts = explode(':', $ID); 1444ab45ba71SJames Collins $count = count($parts); 1445ab45ba71SJames Collins 1446ab45ba71SJames Collins $part = ''; 14479cff245bSJames Collins for ($i = 0; $i < ($count - 1); $i++) { 1448ab45ba71SJames Collins $part .= $parts[$i] . ':'; 1449ab45ba71SJames Collins $page = $part; 14509cff245bSJames Collins if ($page === $conf['start']) { 14519cff245bSJames Collins continue; 14529cff245bSJames Collins } 1453ab45ba71SJames Collins 1454ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 14559cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1456ab45ba71SJames Collins } 1457ab45ba71SJames Collins 1458*fd16ea41SJames Collins $exists = false; 1459ab45ba71SJames Collins resolve_pageid('', $page, $exists); 14609cff245bSJames Collins if ((isset($page) === true && $page === $part . $parts[$i]) === false) { 1461ab45ba71SJames Collins $page = $part . $parts[$i]; 14629cff245bSJames Collins if ($page !== $conf['start']) { 1463ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 14649cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1465ab45ba71SJames Collins } 1466ab45ba71SJames Collins } 1467ab45ba71SJames Collins 1468ab45ba71SJames Collins $html .= '</ul>'; 14699cff245bSJames Collins }//end if 14709cff245bSJames Collins }//end if 1471ab45ba71SJames Collins 14723d11a778SJames Collins $showLast = $this->getConf('youarehereShowLast'); 14739cff245bSJames Collins if ($showLast !== 0) { 1474a8eebd82SJames Collins preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches); 14759cff245bSJames Collins if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) { 1476a8eebd82SJames Collins $count = count($matches[0]); 1477a8eebd82SJames Collins $list = ''; 1478a8eebd82SJames Collins 1479a8eebd82SJames Collins // Show Home 1480a8eebd82SJames Collins $list .= $matches[0][0] . $matches[0][1]; 1481a8eebd82SJames Collins 1482a8eebd82SJames Collins $list .= '<li>...</li>'; 14839cff245bSJames Collins for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) { 1484a8eebd82SJames Collins $list .= $matches[0][$i]; 1485a8eebd82SJames Collins } 1486a8eebd82SJames Collins 1487a8eebd82SJames Collins $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html); 1488a8eebd82SJames Collins } 1489a8eebd82SJames Collins } 1490a8eebd82SJames Collins 14913d11a778SJames Collins switch ($this->getConf('youarehereHome')) { 1492a8eebd82SJames Collins case 'none': 1493a8eebd82SJames Collins $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2); 1494a8eebd82SJames Collins break; 1495a8eebd82SJames Collins case 'home': 1496a8eebd82SJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1); 1497a8eebd82SJames Collins break; 1498a8eebd82SJames Collins case 'icon': 14999cff245bSJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . 15009cff245bSJames Collins $this->mikioInlineIcon('home') . '$3', $html, 1); 1501a8eebd82SJames Collins break; 1502a8eebd82SJames Collins } 1503a8eebd82SJames Collins } else { 1504a8eebd82SJames Collins $html .= '≪ '; 15059cff245bSJames Collins if (isset($_GET['page']) === true) { 15069cff245bSJames Collins $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a> / '; 1507a8eebd82SJames Collins } 15084057121fSJames Collins $html .= '<a href="' . wl($ID) . '">View Page</a>'; 15099cff245bSJames Collins }//end if 15109cff245bSJames Collins 15119cff245bSJames Collins $html .= '</div>'; 15129cff245bSJames Collins $html .= '</div>'; 15139cff245bSJames Collins 15149cff245bSJames Collins if ($parse === true) { 15159cff245bSJames Collins $html = $this->includeIcons($html); 1516a8eebd82SJames Collins } 15179cff245bSJames Collins if ($print === true) { 15189cff245bSJames Collins echo $html; 15199cff245bSJames Collins } 1520ab45ba71SJames Collins return $html; 1521ab45ba71SJames Collins } 1522ab45ba71SJames Collins 15231785fc73SJames Collins /** 15241785fc73SJames Collins * Get Page Title 15259cff245bSJames Collins * 15269cff245bSJames Collins * @return string page title 15271785fc73SJames Collins */ 152810b40067Snomadjimbob public function parsePageTitle() 152910b40067Snomadjimbob { 15302060e56cSJames Collins global $ID; 15312060e56cSJames Collins 15322060e56cSJames Collins $title = p_get_first_heading($ID); 15339cff245bSJames Collins if (strlen($title) <= 0) { 15349cff245bSJames Collins $title = tpl_pagetitle(null, true); 15359cff245bSJames Collins } 15361785fc73SJames Collins $title = $this->includeIcons($title); 15371785fc73SJames Collins 15381785fc73SJames Collins return $title; 15391785fc73SJames Collins } 15401785fc73SJames Collins 1541ab45ba71SJames Collins 154275adba86SJames Collins /** 1543a8eebd82SJames Collins * Print or return hero block 154475adba86SJames Collins * 15459cff245bSJames Collins * @param boolean $print Print content. 1546a8eebd82SJames Collins * @return string contents of hero 154775adba86SJames Collins */ 15489cff245bSJames Collins public function includeHero(bool $print = true) 154910b40067Snomadjimbob { 1550a8eebd82SJames Collins $html = ''; 155147161538SJames Collins 15529cff245bSJames Collins if ($this->getConf('heroTitle') === true) { 1553a8eebd82SJames Collins $html .= '<div class="mikio-hero">'; 1554f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 1555a8eebd82SJames Collins $html .= '<div class="mikio-hero-text">'; 15563a385f2cSJames Collins if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) { 15579cff245bSJames Collins $html .= $this->includeYouAreHere(false); 15589cff245bSJames Collins } 15593a385f2cSJames Collins if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) { 15609cff245bSJames Collins $html .= $this->includeBreadcrumbs(false); 15619cff245bSJames Collins } 1562ab45ba71SJames Collins 1563a8eebd82SJames Collins $html .= '<h1 class="mikio-hero-title">'; 15641785fc73SJames Collins $html .= $this->parsePageTitle(); // No idea why this requires a blank space afterwards to work? 1565a8eebd82SJames Collins $html .= '</h1>'; 1566a8eebd82SJames Collins $html .= '<h2 class="mikio-hero-subtitle"></h2>'; 1567a8eebd82SJames Collins $html .= '</div>'; 156847161538SJames Collins 15699cff245bSJames Collins $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true)); 1570a8eebd82SJames Collins $hero_image_resize_class = ''; 15713a385f2cSJames Collins if (empty($hero_image) === false) { 1572a8eebd82SJames Collins $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"'; 1573a8eebd82SJames Collins $hero_image_resize_class = ' mikio-hero-image-resize'; 157447161538SJames Collins } 1575a8eebd82SJames Collins 15769cff245bSJames Collins $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image . 15779cff245bSJames Collins '><div class="mikio-tags"></div></div>'; 1578a8eebd82SJames Collins 1579a8eebd82SJames Collins $html .= '</div>'; 1580f8039bf2SJames Collins $html .= '</div>'; 15819cff245bSJames Collins }//end if 15829cff245bSJames Collins 15839cff245bSJames Collins if ($print === true) { 15849cff245bSJames Collins echo $html; 158575adba86SJames Collins } 1586a8eebd82SJames Collins 1587a8eebd82SJames Collins return $html; 158875adba86SJames Collins } 158975adba86SJames Collins 159075adba86SJames Collins 159175adba86SJames Collins /** 1592a8eebd82SJames Collins * Print or return out TOC 159375adba86SJames Collins * 15949cff245bSJames Collins * @param boolean $print Print TOC. 15959cff245bSJames Collins * @param boolean $parse Parse icons. 1596a8eebd82SJames Collins * @return string contents of TOC 159775adba86SJames Collins */ 15989cff245bSJames Collins public function includeTOC(bool $print = true, bool $parse = true) 159910b40067Snomadjimbob { 1600ab45ba71SJames Collins $html = ''; 16012b4583abSJames Collins 1602ab45ba71SJames Collins $tocHtml = tpl_toc(true); 1603ab45ba71SJames Collins 16043a385f2cSJames Collins if (empty($tocHtml) === false) { 1605f65a4e5eSJames Collins $tocHtml = preg_replace( 1606f65a4e5eSJames Collins '/(<h3.+?toggle.+?>)(.+?)<\/h3>/', 1607f65a4e5eSJames Collins '$1' . 1608f65a4e5eSJames Collins $this->mikioInlineIcon('hamburger', 'hamburger') . '$2' . 1609f65a4e5eSJames Collins $this->mikioInlineIcon('down-arrow', 'down-arrow') . '</h3>', 1610f65a4e5eSJames Collins $tocHtml 1611f65a4e5eSJames Collins ); 1612ab45ba71SJames Collins $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml); 1613a8eebd82SJames Collins $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml); 1614ab45ba71SJames Collins 1615ab45ba71SJames Collins $html .= '<div class="mikio-toc">'; 1616ab45ba71SJames Collins $html .= $tocHtml; 1617ab45ba71SJames Collins $html .= '</div>'; 16182b4583abSJames Collins } 16192b4583abSJames Collins 16209cff245bSJames Collins if ($parse === true) { 16219cff245bSJames Collins $html = $this->includeIcons($html); 16229cff245bSJames Collins } 16239cff245bSJames Collins 16249cff245bSJames Collins if ($print === true) { 1625ab45ba71SJames Collins echo $html; 1626ab45ba71SJames Collins } 1627ab45ba71SJames Collins 16289cff245bSJames Collins return $html; 16299cff245bSJames Collins } 16309cff245bSJames Collins 1631ab45ba71SJames Collins 1632a8eebd82SJames Collins /** 1633ab45ba71SJames Collins * Parse the string and replace icon elements with included icon libraries 1634ab45ba71SJames Collins * 16359cff245bSJames Collins * @param string $str Content to parse. 1636ab45ba71SJames Collins * @return string parsed string 1637ab45ba71SJames Collins */ 16389cff245bSJames Collins public function includeIcons(string $str) 163910b40067Snomadjimbob { 1640ab45ba71SJames Collins global $ACT, $MIKIO_ICONS; 1641ab45ba71SJames Collins 1642ab45ba71SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 16433a385f2cSJames Collins if (empty($iconTag) === true) { 16449cff245bSJames Collins return $str; 16459cff245bSJames Collins } 1646ab45ba71SJames Collins 16479cff245bSJames Collins if ( 16489cff245bSJames Collins in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true || 16493a385f2cSJames Collins strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0 16509cff245bSJames Collins ) { 1651a2005a27SJames Collins $content = $str; 1652a2005a27SJames Collins $preview = null; 1653a2005a27SJames Collins 16543a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 16559cff245bSJames Collins $html = new \simple_html_dom(); 1656a2005a27SJames Collins $html->stripRNAttrValues = false; 1657a2005a27SJames Collins $html->load($str, true, false); 1658a2005a27SJames Collins 1659a2005a27SJames Collins $preview = $html->find('div.preview'); 16609cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1661a2005a27SJames Collins $content = $preview[0]->innertext; 1662a2005a27SJames Collins } 1663a2005a27SJames Collins } 1664a2005a27SJames Collins 16651785fc73SJames Collins $page_regex = '/(.*)/'; 16669cff245bSJames Collins if (stripos($str, '<pre') !== false) { 16671785fc73SJames Collins $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/'; 16681785fc73SJames Collins } 16691785fc73SJames Collins 16701785fc73SJames Collins $content = preg_replace_callback($page_regex, function ($icons) { 1671a2005a27SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 1672a2005a27SJames Collins 167310b40067Snomadjimbob return preg_replace_callback( 167410b40067Snomadjimbob '/<' . $iconTag . ' ([\w\- #]*)>(?=[^>]*(<|$))/', 1675ab45ba71SJames Collins function ($matches) { 1676ab45ba71SJames Collins global $MIKIO_ICONS; 1677ab45ba71SJames Collins 1678ab45ba71SJames Collins $s = $matches[0]; 1679ab45ba71SJames Collins 1680ab45ba71SJames Collins if (count($MIKIO_ICONS) > 0) { 1681ab45ba71SJames Collins $icon = $MIKIO_ICONS[0]; 1682ab45ba71SJames Collins 1683ab45ba71SJames Collins if (count($matches) > 1) { 1684ab45ba71SJames Collins $e = explode(' ', $matches[1]); 1685ab45ba71SJames Collins 1686ab45ba71SJames Collins if (count($e) > 1) { 1687ab45ba71SJames Collins foreach ($MIKIO_ICONS as $iconItem) { 16889cff245bSJames Collins if (strcasecmp($iconItem['name'], $e[0]) === 0) { 1689ab45ba71SJames Collins $icon = $iconItem; 1690ab45ba71SJames Collins 1691ab45ba71SJames Collins $s = $icon['insert']; 1692ab45ba71SJames Collins for ($i = 1; $i < 9; $i++) { 16931cdedf28SJames Collins if (count($e) < $i || empty($e[$i]) === true) { 16949cff245bSJames Collins if (isset($icon['$' . $i]) === true) { 1695ab45ba71SJames Collins $s = str_replace('$' . $i, $icon['$' . $i], $s); 1696ab45ba71SJames Collins } 1697ab45ba71SJames Collins } else { 1698ab45ba71SJames Collins $s = str_replace('$' . $i, $e[$i], $s); 1699ab45ba71SJames Collins } 1700ab45ba71SJames Collins } 1701ab45ba71SJames Collins 1702ab45ba71SJames Collins $dir = ''; 17039cff245bSJames Collins if (isset($icon['dir']) === true) { 17049cff245bSJames Collins $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/'; 17059cff245bSJames Collins } 1706ab45ba71SJames Collins 1707ab45ba71SJames Collins $s = str_replace('$0', $dir, $s); 1708ab45ba71SJames Collins 1709ab45ba71SJames Collins break; 17109cff245bSJames Collins }//end if 17119cff245bSJames Collins }//end foreach 1712ab45ba71SJames Collins } else { 1713ab45ba71SJames Collins $s = str_replace('$1', $matches[1], $icon['insert']); 17149cff245bSJames Collins }//end if 17159cff245bSJames Collins }//end if 17169cff245bSJames Collins }//end if 171775adba86SJames Collins 1718ab45ba71SJames Collins $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count); 17199cff245bSJames Collins if ($count === 0) { 1720ab45ba71SJames Collins $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s); 1721ab45ba71SJames Collins } 1722ab45ba71SJames Collins 1723ab45ba71SJames Collins return $s; 1724ab45ba71SJames Collins }, 172510b40067Snomadjimbob $icons[0] 172610b40067Snomadjimbob ); 1727a2005a27SJames Collins }, $content); 1728a2005a27SJames Collins 17293a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 17309cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1731a2005a27SJames Collins $preview[0]->innertext = $content; 1732a2005a27SJames Collins } 1733a2005a27SJames Collins 1734a2005a27SJames Collins $str = $html->save(); 1735a2005a27SJames Collins $html->clear(); 1736a2005a27SJames Collins unset($html); 1737a2005a27SJames Collins } else { 1738a2005a27SJames Collins $str = $content; 1739a2005a27SJames Collins } 17409cff245bSJames Collins }//end if 1741ab45ba71SJames Collins 1742ab45ba71SJames Collins return $str; 1743ab45ba71SJames Collins } 174447161538SJames Collins 1745c165b184SJames Collins /** 1746a8eebd82SJames Collins * Parse HTML for theme 1747c165b184SJames Collins * 17489cff245bSJames Collins * @param string $content HTML content to parse. 1749a8eebd82SJames Collins * @return string Parsed content 1750c165b184SJames Collins */ 17519cff245bSJames Collins public function parseContent(string $content) 175210b40067Snomadjimbob { 1753ab45ba71SJames Collins global $INPUT, $ACT; 1754ab45ba71SJames Collins 1755a8eebd82SJames Collins // Add Mikio Section titles 17563a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 17579cff245bSJames Collins $admin_sections = [ 1758ab45ba71SJames Collins // Section Insert Before Icon 17599cff245bSJames Collins 'navbar' => ['navbarUseTitleIcon', ''], 17609cff245bSJames Collins 'search' => ['searchButton', ''], 17619cff245bSJames Collins 'hero' => ['heroTitle', ''], 17629cff245bSJames Collins 'tags' => ['tagsConsolidate', ''], 17639cff245bSJames Collins 'breadcrumb' => ['breadcrumbHideHome', ''], 17649cff245bSJames Collins 'youarehere' => ['youarehereHideHome', ''], 17659cff245bSJames Collins 'sidebar' => ['sidebarShowLeft', ''], 17669cff245bSJames Collins 'toc' => ['tocFull', ''], 17679cff245bSJames Collins 'pagetools' => ['pageToolsFloating', ''], 1768daf2cd7aSJames Collins 'footer' => ['footerPageInfoText', ''], 17699cff245bSJames Collins 'license' => ['licenseType', ''], 17709cff245bSJames Collins 'acl' => ['includePageUseACL', ''], 17719cff245bSJames Collins 'sticky' => ['stickyTopHeader', ''], 17729cff245bSJames Collins ]; 1773ab45ba71SJames Collins 1774ab45ba71SJames Collins foreach ($admin_sections as $section => $items) { 1775ab45ba71SJames Collins $search = $items[0]; 1776ab45ba71SJames Collins $icon = $items[1]; 1777ab45ba71SJames Collins 177810b40067Snomadjimbob $content = preg_replace( 1779adf52ebbSJames Collins '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/', 17809cff245bSJames Collins '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) . 17819cff245bSJames Collins tpl_getLang('config_' . $section) . 17829cff245bSJames Collins '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' . 17839cff245bSJames Collins $search . '</span>', 178410b40067Snomadjimbob $content 178510b40067Snomadjimbob ); 1786ab45ba71SJames Collins } 1787bb5a3dd1SJames Collins } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) { 1788ad182e6dSnomadjimbob $mikioPluginMissing = true; 1789ad182e6dSnomadjimbob /* Hide plugin fields if not installed */ 17909ffe9161Snomadjimbob if (plugin_load('action', 'mikioplugin') !== null) { 1791ad182e6dSnomadjimbob $mikioPluginMissing = false; 1792ad182e6dSnomadjimbob } 1793ad182e6dSnomadjimbob 1794cee81679SJames Collins $style_headers = [ 1795f65a4e5eSJames Collins ['title' => 'Base', 'starts_with' => '__text_'], 1796f65a4e5eSJames Collins ['title' => 'Code', 'starts_with' => '__code_'], 1797f65a4e5eSJames Collins ['title' => 'Controls', 'starts_with' => '__control_'], 1798f65a4e5eSJames Collins ['title' => 'Header', 'starts_with' => '__topheader_'], 1799f65a4e5eSJames Collins ['title' => 'Navbar', 'starts_with' => '__navbar_'], 1800f65a4e5eSJames Collins ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar_'], 1801f65a4e5eSJames Collins ['title' => 'Tags', 'starts_with' => '__tag_background_color_'], 1802f65a4e5eSJames Collins ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb_'], 1803f65a4e5eSJames Collins ['title' => 'Hero', 'starts_with' => '__hero_'], 1804f65a4e5eSJames Collins ['title' => 'Sidebar', 'starts_with' => '__sidebar_'], 1805f65a4e5eSJames Collins ['title' => 'Content', 'starts_with' => '__content_'], 1806f65a4e5eSJames Collins ['title' => 'TOC', 'starts_with' => '__toc_'], 1807f65a4e5eSJames Collins ['title' => 'Page Tools', 'starts_with' => '__pagetools_'], 1808f65a4e5eSJames Collins ['title' => 'Footer', 'starts_with' => '__footer_'], 1809f65a4e5eSJames Collins ['title' => 'Table', 'starts_with' => '__table_'], 1810f65a4e5eSJames Collins ['title' => 'Dropdown', 'starts_with' => '__dropdown_'], 1811f65a4e5eSJames Collins ['title' => 'Section Edit', 'starts_with' => '__section_edit_'], 1812f65a4e5eSJames Collins ['title' => 'Tree', 'starts_with' => '__tree_'], 1813f65a4e5eSJames Collins ['title' => 'Tabs', 'starts_with' => '__tab_'], 1814ad182e6dSnomadjimbob ['title' => 'Mikio Plugin', 'starts_with' => '__plugin_', 'heading' => 'h2', 18159ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18169ffe9161Snomadjimbob ], 1817ad182e6dSnomadjimbob ['title' => 'Primary Colours', 'starts_with' => '__plugin_primary_', 'hidden' => $mikioPluginMissing], 1818ad182e6dSnomadjimbob ['title' => 'Secondary Colours', 'starts_with' => '__plugin_secondary_', 18199ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18209ffe9161Snomadjimbob ], 1821ad182e6dSnomadjimbob ['title' => 'Success Colours', 'starts_with' => '__plugin_success_', 'hidden' => $mikioPluginMissing], 1822ad182e6dSnomadjimbob ['title' => 'Danger Colours', 'starts_with' => '__plugin_danger_', 'hidden' => $mikioPluginMissing], 1823ad182e6dSnomadjimbob ['title' => 'Warning Colours', 'starts_with' => '__plugin_warning_', 'hidden' => $mikioPluginMissing], 1824ad182e6dSnomadjimbob ['title' => 'Info Colours', 'starts_with' => '__plugin_info_', 'hidden' => $mikioPluginMissing], 1825ad182e6dSnomadjimbob ['title' => 'Light Colours', 'starts_with' => '__plugin_light_', 'hidden' => $mikioPluginMissing], 1826ad182e6dSnomadjimbob ['title' => 'Dark Colours', 'starts_with' => '__plugin_dark_', 'hidden' => $mikioPluginMissing], 1827ad182e6dSnomadjimbob ['title' => 'Link Colours', 'starts_with' => '__plugin_link_', 'hidden' => $mikioPluginMissing], 1828ad182e6dSnomadjimbob ['title' => 'Carousel', 'starts_with' => '__plugin_carousel_', 'hidden' => $mikioPluginMissing], 1829ad182e6dSnomadjimbob ['title' => 'Steps', 'starts_with' => '__plugin_steps_', 'hidden' => $mikioPluginMissing], 1830ad182e6dSnomadjimbob ['title' => 'Tabgroup', 'starts_with' => '__plugin_tabgroup_', 'hidden' => $mikioPluginMissing], 1831ad182e6dSnomadjimbob ['title' => 'Tooltip', 'starts_with' => '__plugin_tooltip_', 'hidden' => $mikioPluginMissing], 1832cee81679SJames Collins ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'], 1833f65a4e5eSJames Collins ['title' => 'Base', 'starts_with' => '__darkmode_text_'], 1834f65a4e5eSJames Collins ['title' => 'Code', 'starts_with' => '__darkmode_code_'], 1835f65a4e5eSJames Collins ['title' => 'Controls', 'starts_with' => '__darkmode_control_'], 1836f65a4e5eSJames Collins ['title' => 'Header', 'starts_with' => '__darkmode_topheader_'], 1837f65a4e5eSJames Collins ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar_'], 1838f65a4e5eSJames Collins ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar_'], 1839f65a4e5eSJames Collins ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color_'], 1840f65a4e5eSJames Collins ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb_'], 1841f65a4e5eSJames Collins ['title' => 'Hero', 'starts_with' => '__darkmode_hero_'], 1842f65a4e5eSJames Collins ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar_'], 1843f65a4e5eSJames Collins ['title' => 'Content', 'starts_with' => '__darkmode_content_'], 1844f65a4e5eSJames Collins ['title' => 'TOC', 'starts_with' => '__darkmode_toc_'], 1845f65a4e5eSJames Collins ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools_'], 1846f65a4e5eSJames Collins ['title' => 'Footer', 'starts_with' => '__darkmode_footer_'], 1847f65a4e5eSJames Collins ['title' => 'Table', 'starts_with' => '__darkmode_table_'], 1848f65a4e5eSJames Collins ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown_'], 1849f65a4e5eSJames Collins ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit_'], 1850f65a4e5eSJames Collins ['title' => 'Tree', 'starts_with' => '__darkmode_tree_'], 1851f65a4e5eSJames Collins ['title' => 'Tabs', 'starts_with' => '__darkmode_tab_'], 1852ad182e6dSnomadjimbob ['title' => 'Mikio Plugin (Dark mode)', 'starts_with' => '__plugin_darkmode_', 'heading' => 'h2', 18539ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18549ffe9161Snomadjimbob ], 1855ad182e6dSnomadjimbob ['title' => 'Primary Colours', 'starts_with' => '__plugin_darkmode_primary_', 18569ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18579ffe9161Snomadjimbob ], 1858ad182e6dSnomadjimbob ['title' => 'Secondary Colours', 'starts_with' => '__plugin_darkmode_secondary_', 18599ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18609ffe9161Snomadjimbob ], 1861ad182e6dSnomadjimbob ['title' => 'Success Colours', 'starts_with' => '__plugin_darkmode_success_', 18629ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18639ffe9161Snomadjimbob ], 1864ad182e6dSnomadjimbob ['title' => 'Danger Colours', 'starts_with' => '__plugin_darkmode_danger_', 18659ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18669ffe9161Snomadjimbob ], 1867ad182e6dSnomadjimbob ['title' => 'Warning Colours', 'starts_with' => '__plugin_darkmode_warning_', 18689ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18699ffe9161Snomadjimbob ], 1870ad182e6dSnomadjimbob ['title' => 'Info Colours', 'starts_with' => '__plugin_darkmode_info_', 18719ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18729ffe9161Snomadjimbob ], 1873ad182e6dSnomadjimbob ['title' => 'Light Colours', 'starts_with' => '__plugin_darkmode_light_', 18749ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18759ffe9161Snomadjimbob ], 1876ad182e6dSnomadjimbob ['title' => 'Dark Colours', 'starts_with' => '__plugin_darkmode_dark_', 18779ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18789ffe9161Snomadjimbob ], 1879ad182e6dSnomadjimbob ['title' => 'Link Colours', 'starts_with' => '__plugin_darkmode_link_', 18809ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18819ffe9161Snomadjimbob ], 1882ad182e6dSnomadjimbob ['title' => 'Carousel', 'starts_with' => '__plugin_darkmode_carousel_', 18839ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18849ffe9161Snomadjimbob ], 1885ad182e6dSnomadjimbob ['title' => 'Steps', 'starts_with' => '__plugin_darkmode_steps_', 'hidden' => $mikioPluginMissing], 1886ad182e6dSnomadjimbob ['title' => 'Tabgroup', 'starts_with' => '__plugin_darkmode_tabgroup_', 18879ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 18889ffe9161Snomadjimbob ], 1889ad182e6dSnomadjimbob ['title' => 'Tooltip', 'starts_with' => '__plugin_darkmode_tooltip_', 'hidden' => $mikioPluginMissing], 1890cee81679SJames Collins ]; 1891cee81679SJames Collins 1892cee81679SJames Collins foreach ($style_headers as $header) { 1893cee81679SJames Collins if (array_key_exists('heading', $header) === false) { 1894cee81679SJames Collins $header['heading'] = 'h3'; 1895cee81679SJames Collins } 1896cee81679SJames Collins 1897ad182e6dSnomadjimbob if (array_key_exists('hidden', $header) === false) { 1898ad182e6dSnomadjimbob $header['hidden'] = false; 1899ad182e6dSnomadjimbob } 1900ad182e6dSnomadjimbob 19011244e3ceSJames Collins $content = preg_replace( 1902f65a4e5eSJames Collins '/(<tr>\s*<td>\s*<label for="tpl__' . $header['starts_with'] . '.+?<\/tr>)/s', 19039ffe9161Snomadjimbob '</tbody></table><' . $header['heading'] . ' style="display:' . 19049ffe9161Snomadjimbob ($header['hidden'] === true ? 'none' : 'block') . '">' . 19059ffe9161Snomadjimbob $header['title'] . '</' . $header['heading'] . '> 1906ad182e6dSnomadjimbob <table style="display:' . ($header['hidden'] === true ? 'none' : 'table') . '"><tbody>$1', 19071244e3ceSJames Collins $content, 19081244e3ceSJames Collins 1 19091244e3ceSJames Collins ); 1910cee81679SJames Collins } 1911f65a4e5eSJames Collins 1912dea1f088SJames Collins $content = preg_replace_callback('/<input type="color"[^>]*>/', function ($match) { 1913dea1f088SJames Collins // Get the ID of the <input type="color"> element 1914dea1f088SJames Collins preg_match('/id="([^"]*)"/', $match[0], $matches); 1915dea1f088SJames Collins 1916dea1f088SJames Collins // Replace type with text and remove the id attribute 19172c87ab0dSJames Collins $replacement = preg_replace( 19182c87ab0dSJames Collins ['/type="color"/', '/id="([^"]*)"/'], 19192c87ab0dSJames Collins ['type="text" class="mikio-color-text-input"', 'for="$1"'], 19202c87ab0dSJames Collins $match[0] 19212c87ab0dSJames Collins ); 1922dea1f088SJames Collins 1923dea1f088SJames Collins return '<div class="mikio-color-picker">' . $replacement . $match[0] . '</div>'; 1924dea1f088SJames Collins }, $content); 1925bb5a3dd1SJames Collins }//end if 1926ab45ba71SJames Collins 19273a385f2cSJames Collins if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) { 1928a8eebd82SJames Collins $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content); 1929a8eebd82SJames Collins } 1930ab45ba71SJames Collins 1931a8eebd82SJames Collins // Page Revisions - Table Fix 19329cff245bSJames Collins if (strpos($content, 'id="page__revisions"') !== false) { 19339cff245bSJames Collins $content = preg_replace( 19349cff245bSJames Collins '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/', 19359cff245bSJames Collins '<span>$1</span>', 19369cff245bSJames Collins $content 19379cff245bSJames Collins ); 1938a8eebd82SJames Collins } 1939ab45ba71SJames Collins 19409cff245bSJames Collins $html = new \simple_html_dom(); 1941bc1032d9SJames Collins $html->stripRNAttrValues = false; 1942c165b184SJames Collins $html->load($content, true, false); 1943c165b184SJames Collins 19449cff245bSJames Collins if ($html === false) { 19459cff245bSJames Collins return $content; 19469cff245bSJames Collins } 1947ab45ba71SJames Collins 1948ab45ba71SJames Collins /* Buttons */ 1949ab45ba71SJames Collins foreach ($html->find('#config__manager button') as $node) { 1950ab45ba71SJames Collins $c = explode(' ', $node->class); 19519cff245bSJames Collins if (in_array('mikio-button', $c) === false) { 19529cff245bSJames Collins $c[] = 'mikio-button'; 19539cff245bSJames Collins } 1954ab45ba71SJames Collins $node->class = implode(' ', $c); 1955c165b184SJames Collins } 1956c165b184SJames Collins 1957ab45ba71SJames Collins 1958ab45ba71SJames Collins /* Buttons - Primary */ 1959ab45ba71SJames Collins foreach ($html->find('#config__manager [type=submit]') as $node) { 1960ab45ba71SJames Collins $c = explode(' ', $node->class); 19619cff245bSJames Collins if (in_array('mikio-primary', $c) === false) { 19629cff245bSJames Collins $c[] = 'mikio-primary'; 19639cff245bSJames Collins } 1964ab45ba71SJames Collins $node->class = implode(' ', $c); 1965ab45ba71SJames Collins } 1966ab45ba71SJames Collins 1967a8eebd82SJames Collins /* Hide page title if hero is enabled */ 19689cff245bSJames Collins if ($this->getConf('heroTitle') === true && $ACT !== 'preview') { 19691785fc73SJames Collins $pageTitle = $this->parsePageTitle(); 197047161538SJames Collins 197147161538SJames Collins foreach ($html->find('h1,h2,h3,h4') as $elm) { 19729cff245bSJames Collins if ($elm->innertext === $pageTitle) { 1973a8eebd82SJames Collins // $elm->innertext = ''; 1974a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1975a8eebd82SJames Collins 197647161538SJames Collins break; 197747161538SJames Collins } 197847161538SJames Collins } 197947161538SJames Collins } 1980c165b184SJames Collins 1981a8eebd82SJames Collins /* Hero subtitle */ 19822b4583abSJames Collins foreach ($html->find('p') as $elm) { 1983d0d6c450SJames Collins if (preg_match('/[~-]~hero-subtitle (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) { 1984d0d6c450SJames Collins $subtitle = $matches[1]; 1985a8eebd82SJames Collins $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')'; 1986a8eebd82SJames Collins 1987d0d6c450SJames Collins $elm->innertext = preg_replace('/[~-]~hero-subtitle (.+?)~[~-]/ui', '', $elm->innertext); 19882b4583abSJames Collins break; 19892b4583abSJames Collins } 19902b4583abSJames Collins } 19912b4583abSJames Collins 1992a8eebd82SJames Collins /* Hero image */ 1993a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1994a8eebd82SJames Collins $image = ''; 1995d0d6c450SJames Collins preg_match('/[~-]~hero-image (.+?)~[~-](?!.?")/ui', $elm->innertext, $matches); 1996a8eebd82SJames Collins if (count($matches) > 0) { 1997a8eebd82SJames Collins preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches); 1998a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1999a8eebd82SJames Collins $image = $imageTagMatches[1]; 2000a8eebd82SJames Collins } else { 2001a8eebd82SJames Collins preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches); 2002a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 2003a8eebd82SJames Collins $image = $imageTagMatches[1]; 2004a8eebd82SJames Collins } else { 2005a8eebd82SJames Collins $image = strip_tags($matches[1]); 20069cff245bSJames Collins if (stripos($image, ':') === false) { 20079cff245bSJames Collins $image = str_replace(['{', '}'], '', $image); 2008a8eebd82SJames Collins $i = stripos($image, '?'); 20099cff245bSJames Collins if ($i !== false) { 2010a8eebd82SJames Collins $image = substr($image, 0, $i); 2011c165b184SJames Collins } 2012c165b184SJames Collins 2013a8eebd82SJames Collins $image = ml($image, '', true, '', false); 2014ab45ba71SJames Collins } 2015ab45ba71SJames Collins } 2016ab45ba71SJames Collins } 2017ab45ba71SJames Collins 2018a8eebd82SJames Collins $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')'; 2019a8eebd82SJames Collins 2020d0d6c450SJames Collins $elm->innertext = preg_replace('/[~-]~hero-image (.+?)~[~-].*/ui', '', $elm->innertext); 20219cff245bSJames Collins }//end if 20229cff245bSJames Collins }//end foreach 2023ab45ba71SJames Collins 20249cff245bSJames Collins /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color] 20259cff245bSJames Collins [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */ 2026a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 2027d0d6c450SJames Collins if (preg_match('/[~-]~hero-colors (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) { 2028d0d6c450SJames Collins $subtitle = $matches[1]; 2029d0d6c450SJames Collins $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $subtitle . '\')'; 2030ab45ba71SJames Collins 2031d0d6c450SJames Collins $elm->innertext = preg_replace('/[~-]~hero-colors (.+?)~[~-]/ui', '', $elm->innertext); 2032a8eebd82SJames Collins break; 2033ab45ba71SJames Collins } 2034ab45ba71SJames Collins } 2035ab45ba71SJames Collins 203696ec8e1eSJames Collins /* Hide parts - ~~hide-parts [parts]~~ */ 203796ec8e1eSJames Collins foreach ($html->find('p') as $elm) { 20383a44a74aSJames Collins if (preg_match('/[~-]~hide-parts (.+?)~[~-]/ui', $elm->innertext, $matches) === 1) { 2039d0d6c450SJames Collins $parts = explode(' ', $matches[1]); 204096ec8e1eSJames Collins $script = ''; 204196ec8e1eSJames Collins 204296ec8e1eSJames Collins foreach ($parts as $part) { 204396ec8e1eSJames Collins if (strlen($part) > 0) { 204496ec8e1eSJames Collins $script .= 'mikio.hidePart(\'' . $part . '\');'; 204596ec8e1eSJames Collins } 204696ec8e1eSJames Collins } 204796ec8e1eSJames Collins 204896ec8e1eSJames Collins if (strlen($script) > 0) { 204996ec8e1eSJames Collins $this->footerScript['hide-parts'] = $script; 205096ec8e1eSJames Collins } 205196ec8e1eSJames Collins 20523a44a74aSJames Collins $elm->innertext = preg_replace('/[~-]~hide-parts (.+?)~[~-]/ui', '', $elm->innertext); 205396ec8e1eSJames Collins break; 2054d0d6c450SJames Collins } 20559cff245bSJames Collins }//end foreach 205696ec8e1eSJames Collins 205796ec8e1eSJames Collins 2058a8eebd82SJames Collins /* Page Tags (tag plugin) */ 20599cff245bSJames Collins if ($this->getConf('tagsConsolidate') === true) { 2060a8eebd82SJames Collins $tags = ''; 2061a8eebd82SJames Collins foreach ($html->find('div.tags a') as $elm) { 2062a8eebd82SJames Collins $tags .= $elm->outertext; 2063a8eebd82SJames Collins } 2064a8eebd82SJames Collins 2065a8eebd82SJames Collins foreach ($html->find('div.tags') as $elm) { 2066a8eebd82SJames Collins $elm->innertext = ''; 2067a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 2068a8eebd82SJames Collins } 2069a8eebd82SJames Collins 20703a385f2cSJames Collins if (empty($tags) === false) { 2071a8eebd82SJames Collins $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')'; 2072a8eebd82SJames Collins } 2073ab45ba71SJames Collins } 2074ab45ba71SJames Collins 2075ab45ba71SJames Collins // Configuration Manager 20763a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 2077ab45ba71SJames Collins // Additional save buttons 2078ab45ba71SJames Collins foreach ($html->find('#config__manager') as $cm) { 2079ab45ba71SJames Collins $saveButtons = ''; 2080ab45ba71SJames Collins 2081ab45ba71SJames Collins foreach ($cm->find('p') as $elm) { 2082ab45ba71SJames Collins $saveButtons = $elm->outertext; 2083a8eebd82SJames Collins $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons); 2084ab45ba71SJames Collins $elm->outertext = ''; 2085ab45ba71SJames Collins } 2086ab45ba71SJames Collins 2087ab45ba71SJames Collins foreach ($cm->find('fieldset') as $elm) { 2088ab45ba71SJames Collins $elm->innertext .= $saveButtons; 2089ab45ba71SJames Collins } 2090ab45ba71SJames Collins } 2091ab45ba71SJames Collins } 2092ab45ba71SJames Collins 2093ab45ba71SJames Collins $content = $html->save(); 2094c165b184SJames Collins $html->clear(); 2095c165b184SJames Collins unset($html); 2096c165b184SJames Collins 2097c165b184SJames Collins return $content; 2098c165b184SJames Collins } 20992b4583abSJames Collins 21002b4583abSJames Collins 2101a8eebd82SJames Collins /** 2102a8eebd82SJames Collins * Get DokuWiki namespace/page/URI as link 2103a8eebd82SJames Collins * 21049cff245bSJames Collins * @param string $str String to parse. 21059cff245bSJames Collins * @return string parsed URI 2106a8eebd82SJames Collins */ 21079cff245bSJames Collins public function getLink(string $str) 210810b40067Snomadjimbob { 21092b4583abSJames Collins $i = strpos($str, '://'); 21109cff245bSJames Collins if ($i !== false) { 21119cff245bSJames Collins return $str; 21129cff245bSJames Collins } 21132b4583abSJames Collins 21142b4583abSJames Collins return wl($str); 21152b4583abSJames Collins } 2116ab45ba71SJames Collins 2117ab45ba71SJames Collins 2118a8eebd82SJames Collins /** 2119a8eebd82SJames Collins * Check if the user can edit current namespace/page 2120a8eebd82SJames Collins * 2121a8eebd82SJames Collins * @return boolean user can edit 2122a8eebd82SJames Collins */ 212310b40067Snomadjimbob public function userCanEdit() 212410b40067Snomadjimbob { 2125ab45ba71SJames Collins global $INFO; 2126ab45ba71SJames Collins global $ID; 2127ab45ba71SJames Collins 2128ab45ba71SJames Collins $wiki_file = wikiFN($ID); 21299cff245bSJames Collins if (@file_exists($wiki_file) === false) { 21309cff245bSJames Collins return true; 21319cff245bSJames Collins } 21329cff245bSJames Collins if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) { 21339cff245bSJames Collins return true; 21349cff245bSJames Collins } 2135a8eebd82SJames Collins // $meta_file = metaFN($ID, '.meta'); 21369cff245bSJames Collins if ($INFO['meta']['user'] === false) { 21379cff245bSJames Collins return true; 21389cff245bSJames Collins } 21399cff245bSJames Collins if ($INFO['client'] === $INFO['meta']['user']) { 21409cff245bSJames Collins return true; 21419cff245bSJames Collins } 2142ab45ba71SJames Collins 2143ab45ba71SJames Collins return false; 2144c165b184SJames Collins } 214547161538SJames Collins 214647161538SJames Collins 2147a8eebd82SJames Collins /** 2148a8eebd82SJames Collins * Search for and return the uri of a media file 2149a8eebd82SJames Collins * 21509cff245bSJames Collins * @param string $image Image name to search for (without extension). 21519cff245bSJames Collins * @param boolean $searchCurrentNS Search the current namespace. 21529cff245bSJames Collins * @param boolean $propagate Propagate search through the namespace. 21539cff245bSJames Collins * @return string URI of the found media file 2154a8eebd82SJames Collins */ 21559cff245bSJames Collins public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true) 215610b40067Snomadjimbob { 2157ab45ba71SJames Collins global $INFO; 2158a8eebd82SJames Collins 21599cff245bSJames Collins $ext = ['png', 'jpg', 'gif', 'svg']; 2160ab45ba71SJames Collins 21619cff245bSJames Collins if ($searchCurrentNS === true) { 21629cff245bSJames Collins $prefix[] = ':' . $INFO['namespace'] . ':'; 21639cff245bSJames Collins } 21649cff245bSJames Collins if ($propagate === true) { 2165ab45ba71SJames Collins $prefix[] = ':'; 2166ab45ba71SJames Collins $prefix[] = ':wiki:'; 2167a8eebd82SJames Collins } 2168ab45ba71SJames Collins $theme = $this->getConf('customTheme'); 21693a385f2cSJames Collins if (empty($theme) === false) { 21709cff245bSJames Collins $prefix[] = 'themes/' . $theme . '/images/'; 21719cff245bSJames Collins } 2172ab45ba71SJames Collins $prefix[] = 'images/'; 2173ab45ba71SJames Collins 21749cff245bSJames Collins $search = []; 2175ab45ba71SJames Collins foreach ($prefix as $pitem) { 2176ab45ba71SJames Collins foreach ($ext as $eitem) { 2177ab45ba71SJames Collins $search[] = $pitem . $image . '.' . $eitem; 2178ab45ba71SJames Collins } 2179ab45ba71SJames Collins } 2180ab45ba71SJames Collins 2181ab45ba71SJames Collins $img = ''; 2182ab45ba71SJames Collins $file = ''; 2183ab45ba71SJames Collins $url = ''; 2184ab45ba71SJames Collins $ismedia = false; 2185ab45ba71SJames Collins $found = false; 2186ab45ba71SJames Collins 2187ab45ba71SJames Collins foreach ($search as $img) { 21883a385f2cSJames Collins if (strcasecmp(substr($img, 0, 1), ':') === 0) { 2189ab45ba71SJames Collins $file = mediaFN($img); 2190ab45ba71SJames Collins $ismedia = true; 2191ab45ba71SJames Collins } else { 2192ab45ba71SJames Collins $file = tpl_incdir() . $img; 2193ab45ba71SJames Collins $ismedia = false; 2194ab45ba71SJames Collins } 2195ab45ba71SJames Collins 21969cff245bSJames Collins if (file_exists($file) === true) { 2197ab45ba71SJames Collins $found = true; 2198ab45ba71SJames Collins break; 2199ab45ba71SJames Collins } 2200ab45ba71SJames Collins } 2201ab45ba71SJames Collins 22029cff245bSJames Collins if ($found === false) { 22039cff245bSJames Collins return false; 22049cff245bSJames Collins } 2205ab45ba71SJames Collins 22069cff245bSJames Collins if ($ismedia === true) { 2207ab45ba71SJames Collins $url = ml($img, '', true, '', false); 2208ab45ba71SJames Collins } else { 2209ab45ba71SJames Collins $url = tpl_basedir() . $img; 2210ab45ba71SJames Collins } 2211ab45ba71SJames Collins 2212ab45ba71SJames Collins return $url; 2213ab45ba71SJames Collins } 2214ab45ba71SJames Collins 2215a8eebd82SJames Collins 2216a8eebd82SJames Collins /** 2217ab45ba71SJames Collins * Print or return the page title 2218ab45ba71SJames Collins * 22199cff245bSJames Collins * @param string $page Page id or empty string for current page. 2220ab45ba71SJames Collins * @return string generated content 2221ab45ba71SJames Collins */ 22229cff245bSJames Collins public function getPageTitle(string $page = '') 222310b40067Snomadjimbob { 2224ab45ba71SJames Collins global $ID, $conf; 2225ab45ba71SJames Collins 2226ab45ba71SJames Collins $html = ''; 2227ab45ba71SJames Collins 22283a385f2cSJames Collins if (empty($page) === true) { 22299cff245bSJames Collins $page = $ID; 22309cff245bSJames Collins } 2231ab45ba71SJames Collins 2232ab45ba71SJames Collins $html = p_get_first_heading($page); 2233ab45ba71SJames Collins $html = strip_tags($html); 2234ab45ba71SJames Collins $html = preg_replace('/\s+/', ' ', $html); 2235ab45ba71SJames Collins $html .= ' [' . strip_tags($conf['title']) . ']'; 2236ab45ba71SJames Collins $html = trim($html); 2237ab45ba71SJames Collins 2238ab45ba71SJames Collins return $html; 2239ab45ba71SJames Collins } 2240a8eebd82SJames Collins 2241a8eebd82SJames Collins 2242a8eebd82SJames Collins /** 2243a8eebd82SJames Collins * Return inline theme icon 2244a8eebd82SJames Collins * 22459cff245bSJames Collins * @param string $type Icon to retreive. 22469e41d878SJames Collins * @param string $class Classname to insert. 22479cff245bSJames Collins * @return string HTML icon content 2248a8eebd82SJames Collins */ 22499e41d878SJames Collins public function mikioInlineIcon(string $type, string $class = "") 225010b40067Snomadjimbob { 22519e41d878SJames Collins if (is_array($class) === true) { 22529e41d878SJames Collins $class = explode(' ', $class); 22539e41d878SJames Collins } 22549e41d878SJames Collins 22559e41d878SJames Collins if (strlen($class) > 0) { 22569e41d878SJames Collins $class = ' ' . $class; 22579e41d878SJames Collins } 22589e41d878SJames Collins 2259a8eebd82SJames Collins switch ($type) { 2260a8eebd82SJames Collins case 'wrench': 2261906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 2262906e1a13SJames 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, 2263906e1a13SJames 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, 2264906e1a13SJames 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, 2265906e1a13SJames 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 2266906e1a13SJames 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, 2267906e1a13SJames 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>'; 2268a8eebd82SJames Collins case 'file': 2269906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2270906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991"> 2271906e1a13SJames 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 2272906e1a13SJames 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 2273906e1a13SJames 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" 22749cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 2275a8eebd82SJames Collins case 'gear': 2276906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2277906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027"> 2278906e1a13SJames 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 2279906e1a13SJames 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 2280906e1a13SJames 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 2281906e1a13SJames 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 2282906e1a13SJames 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 2283906e1a13SJames 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, 2284906e1a13SJames 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 2285906e1a13SJames 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 2286906e1a13SJames 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" /> 2287906e1a13SJames Collins</g></svg>'; 2288a8eebd82SJames Collins case 'user': 2289906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2290906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M 2291906e1a13SJames 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 2292906e1a13SJames 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, 2293906e1a13SJames 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 2294906e1a13SJames 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 2295906e1a13SJames 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, 2296906e1a13SJames Collins1408 863,1408 975.5,1295.5 1088,1183 1088,1024 z"/></g></svg>'; 2297a8eebd82SJames Collins case 'search': 22989e41d878SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" 22999cff245bSJames 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 23009cff245bSJames 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 23019cff245bSJames 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 23029cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>'; 2303a8eebd82SJames Collins case 'home': 2304906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2305906e1a13SJames CollinsviewBox="0 -256 1792 1792" aria-hidden="true" style="fill:currentColor"><g 2306906e1a13SJames 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 2307906e1a13SJames 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 2308906e1a13SJames 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 2309906e1a13SJames 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, 2310906e1a13SJames 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" 23119cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 23129e41d878SJames Collins case 'sun': 2313906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2314906e1a13SJames 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 2315906e1a13SJames 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 2316906e1a13SJames 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 2317906e1a13SJames 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 2318906e1a13SJames Collins0 0 1-.707.707z" /></svg>'; 23199e41d878SJames Collins case 'moon': 2320906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2321906e1a13SJames 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 2322906e1a13SJames 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 2323906e1a13SJames 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 2324906e1a13SJames 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 2325906e1a13SJames Collins0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>'; 232634d5f19aSJames Collins case 'sunmoon': 2327d0fba6d1SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2328d0fba6d1SJames Collinsstyle="fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10" 2329d0fba6d1SJames 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 2330d0fba6d1SJames 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" 2331d0fba6d1SJames 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, 2332d0fba6d1SJames 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>'; 2333f65a4e5eSJames Collins case 'hamburger': 2334f65a4e5eSJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" 2335f65a4e5eSJames 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 2336f65a4e5eSJames 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 2337f65a4e5eSJames 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 2338f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16z"/></svg>'; 2339f65a4e5eSJames Collins case 'down-arrow': 2340f65a4e5eSJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" 2341f65a4e5eSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M16.003 18.626l7.081-7.081L25 13.46l-8.997 8.998-9.003-9 2342f65a4e5eSJames Collins1.917-1.916z"/></svg>'; 23433a3ece10SJames Collins case 'language': 23443a3ece10SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" width="16" 23453a3ece10SJames Collinsheight="16" fill="currentColor" viewBox="0 0 16 16"><path d="M4.545 6.714 4.11 23463a3ece10SJames 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 23473a3ece10SJames 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 23483a3ece10SJames 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 23493a3ece10SJames 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 23503a3ece10SJames Collins1.472.133-.254.414-.673.629-.89-1.125-.253-2.057-.694-2.82-1.284.681-.747 1.222-1.651 23513a3ece10SJames 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"/> 23523a3ece10SJames Collins</svg>'; 23539cff245bSJames Collins }//end switch 2354ab45ba71SJames Collins 2355a8eebd82SJames Collins return ''; 2356a8eebd82SJames Collins } 2357ab45ba71SJames Collins 2358a8eebd82SJames Collins /** 2359a8eebd82SJames Collins * Finalize theme 23609cff245bSJames Collins * 23619cff245bSJames Collins * @return void 2362a8eebd82SJames Collins */ 236310b40067Snomadjimbob public function finalize() 236410b40067Snomadjimbob { 2365a8eebd82SJames Collins } 23661785fc73SJames Collins 23671785fc73SJames Collins /** 23681785fc73SJames Collins * Show Messages 23699cff245bSJames Collins * 23709cff245bSJames Collins * @return void 23711785fc73SJames Collins */ 237210b40067Snomadjimbob public function showMessages() 237310b40067Snomadjimbob { 23741785fc73SJames Collins global $ACT; 23751785fc73SJames Collins 23769cff245bSJames Collins if ($this->lessIgnored === true) { 23779cff245bSJames Collins msg( 23789cff245bSJames Collins 'useLESS is enabled on the Mikio template, however is not supported on this server', 23799cff245bSJames Collins 2, 23809cff245bSJames Collins '', 23819cff245bSJames Collins '', 23829cff245bSJames Collins MSG_ADMINS_ONLY 23839cff245bSJames Collins ); 2384a8df40efSJames Collins } 2385a8df40efSJames Collins 23861785fc73SJames Collins $show = $this->getConf('showNotifications'); 23873a385f2cSJames Collins if ( 23884f8225e4SJames Collins strlen($show) === 0 || 23893a385f2cSJames Collins strcasecmp($show, 'always') === 0 || 23903a385f2cSJames Collins (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0) 23913a385f2cSJames Collins ) { 23922d241f94SJames Collins html_msgarea(); 23931785fc73SJames Collins 23942d241f94SJames Collins // global $MSG, $MSG_shown; 23951785fc73SJames Collins 23962d241f94SJames Collins // if (isset($MSG) !== false) { 23972d241f94SJames Collins // if (isset($MSG_shown) === false) { 23982d241f94SJames Collins // $MSG_shown = []; 23992d241f94SJames Collins // } 24001785fc73SJames Collins 24012d241f94SJames Collins // foreach ($MSG as $msg) { 24022d241f94SJames Collins // $hash = md5($msg['msg']); 24032d241f94SJames Collins // if (isset($MSG_shown[$hash]) === true) { 24042d241f94SJames Collins // continue; 24052d241f94SJames Collins // } 24062d241f94SJames Collins // // skip double messages 24071785fc73SJames Collins 24082d241f94SJames Collins // if (info_msg_allowed($msg) === true) { 24092d241f94SJames Collins // echo '<div class="me ' . $msg['lvl'] . '">'; 24102d241f94SJames Collins // echo $msg['msg']; 24112d241f94SJames Collins // echo '</div>'; 24122d241f94SJames Collins // } 24131785fc73SJames Collins 24142d241f94SJames Collins // $MSG_shown[$hash] = true; 24152d241f94SJames Collins // } 24162d241f94SJames Collins 24172d241f94SJames Collins // unset($GLOBALS['MSG']); 24182d241f94SJames Collins // }//end if 24194f8225e4SJames Collins 24204f8225e4SJames Collins if (strlen($this->includedPageNotifications) > 0) { 24214f8225e4SJames Collins echo $this->includedPageNotifications; 24224f8225e4SJames Collins } 24234f8225e4SJames Collins }//end if 24241785fc73SJames Collins } 24257ac0a6efSJames Collins 24267ac0a6efSJames Collins /** 24277ac0a6efSJames Collins * Dokuwiki version 24287ac0a6efSJames Collins * 24297ac0a6efSJames Collins * @return string the dw version name 24307ac0a6efSJames Collins */ 24319cff245bSJames Collins public function dwVersion() 24329cff245bSJames Collins { 24339cff245bSJames Collins if (function_exists('getVersionData') === true) { 24347ac0a6efSJames Collins $version_data = getVersionData(); 24359cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 24367ac0a6efSJames Collins $version_items = explode(' ', $version_data['date']); 24377ac0a6efSJames Collins if (count($version_items) >= 2) { 24387ac0a6efSJames Collins return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1])); 24397ac0a6efSJames Collins } 24407ac0a6efSJames Collins } 24417ac0a6efSJames Collins } 24427ac0a6efSJames Collins 24437ac0a6efSJames Collins return 'unknown'; 24447ac0a6efSJames Collins } 2445e4c4fb13SJames Collins 2446e4c4fb13SJames Collins /** 2447e4c4fb13SJames Collins * Dokuwiki version number 2448e4c4fb13SJames Collins * 2449e4c4fb13SJames Collins * @return string the dw version date converted to integer 2450e4c4fb13SJames Collins */ 24519cff245bSJames Collins public function dwVersionNumber() 24529cff245bSJames Collins { 24539cff245bSJames Collins if (function_exists('getVersionData') === true) { 2454e4c4fb13SJames Collins $version_data = getVersionData(); 24559cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 2456e4c4fb13SJames Collins $version_items = explode(' ', $version_data['date']); 2457e4c4fb13SJames Collins if (count($version_items) >= 1) { 2458e4c4fb13SJames Collins return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0]))); 2459e4c4fb13SJames Collins } 2460e4c4fb13SJames Collins } 2461e4c4fb13SJames Collins } 2462e4c4fb13SJames Collins 2463e4c4fb13SJames Collins return 0; 2464e4c4fb13SJames Collins } 2465a8eebd82SJames Collins} 2466ab45ba71SJames Collins 2467ab45ba71SJames Collinsglobal $TEMPLATE; 246847161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance(); 2469