1c165b184SJames Collins<?php 210b40067Snomadjimbob 3c165b184SJames Collins/** 4c165b184SJames Collins * DokuWiki Mikio Template 5c165b184SJames Collins * 6c165b184SJames Collins * @link http://dokuwiki.org/template:mikio 7c165b184SJames Collins * @author James Collins <james.collins@outlook.com.au> 8ab45ba71SJames Collins * @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html) 9c165b184SJames Collins */ 1010b40067Snomadjimbob 11ab45ba71SJames Collinsnamespace dokuwiki\template\mikio; 12c165b184SJames Collins 139cff245bSJames Collinsif (defined('DOKU_INC') === false) { 149cff245bSJames Collins die(); 159cff245bSJames Collins} 16c165b184SJames Collins 17ab45ba71SJames Collinsrequire_once('icons/icons.php'); 18c165b184SJames Collinsrequire_once('inc/simple_html_dom.php'); 19c165b184SJames Collins 2010b40067Snomadjimbobclass Template 2110b40067Snomadjimbob{ 229cff245bSJames Collins /** 239cff245bSJames Collins * @var string Template directory path from local FS. 249cff245bSJames Collins */ 25c165b184SJames Collins public $tplDir = ''; 269cff245bSJames Collins 279cff245bSJames Collins /** 289cff245bSJames Collins * @var string Template directory path from web. 299cff245bSJames Collins */ 30c165b184SJames Collins public $baseDir = ''; 319cff245bSJames Collins 329cff245bSJames Collins /** 339cff245bSJames Collins * @var array Array of Javascript files to include in footer. 349cff245bSJames Collins */ 359cff245bSJames Collins public $footerScript = []; 369cff245bSJames Collins 379cff245bSJames Collins /** 389cff245bSJames Collins * @var boolean Ignore LESS files. 399cff245bSJames Collins */ 40a8df40efSJames Collins public $lessIgnored = false; 41c165b184SJames Collins 42c165b184SJames Collins 43c165b184SJames Collins /** 44c165b184SJames Collins * Class constructor 45c165b184SJames Collins */ 4610b40067Snomadjimbob public function __construct() 4710b40067Snomadjimbob { 48c165b184SJames Collins $this->tplDir = tpl_incdir(); 49c165b184SJames Collins $this->baseDir = tpl_basedir(); 50c165b184SJames Collins 519cff245bSJames Collins $this->registerHooks(); 52c165b184SJames Collins } 53c165b184SJames Collins 54c165b184SJames Collins 55c165b184SJames Collins /** 56ab45ba71SJames Collins * Returns the instance of the class 5747161538SJames Collins * 58ab45ba71SJames Collins * @return Template class instance 5947161538SJames Collins */ 6047161538SJames Collins public static function getInstance() 6147161538SJames Collins { 6247161538SJames Collins static $instance = null; 6347161538SJames Collins 643a385f2cSJames Collins if (empty($instance) === true) { 6547161538SJames Collins $instance = new Template(); 6647161538SJames Collins } 6747161538SJames Collins 6847161538SJames Collins return $instance; 6947161538SJames Collins } 7047161538SJames Collins 71ab45ba71SJames Collins 7247161538SJames Collins /** 73ab45ba71SJames Collins * Register the themes hooks into Dokuwiki 749cff245bSJames Collins * 759cff245bSJames Collins * @return void 76c165b184SJames Collins */ 779cff245bSJames Collins private function registerHooks() 7810b40067Snomadjimbob { 79c165b184SJames Collins global $EVENT_HANDLER; 80c165b184SJames Collins 819cff245bSJames Collins $events_dispatcher = [ 82ab45ba71SJames Collins 'TPL_METAHEADER_OUTPUT' => 'metaheadersHandler' 839cff245bSJames Collins ]; 84c165b184SJames Collins 85c165b184SJames Collins foreach ($events_dispatcher as $event => $method) { 86c165b184SJames Collins $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method); 87c165b184SJames Collins } 88c165b184SJames Collins } 89c165b184SJames Collins 90c165b184SJames Collins 91c165b184SJames Collins /** 92ab45ba71SJames Collins * Meta handler hook for DokuWiki 93c165b184SJames Collins * 949cff245bSJames Collins * @param \Doku_Event $event DokuWiki Event. 959cff245bSJames Collins * @return void 96c165b184SJames Collins */ 9710b40067Snomadjimbob public function metaHeadersHandler(\Doku_Event $event) 9810b40067Snomadjimbob { 99ab45ba71SJames Collins global $MIKIO_ICONS; 100b5536b07SChris MacMackin global $conf; 101ab45ba71SJames Collins 1029cff245bSJames Collins $this->includePage('theme', false, true); 103a8eebd82SJames Collins 1049cff245bSJames Collins $stylesheets = []; 1059cff245bSJames Collins $scripts = []; 106c165b184SJames Collins 1073a385f2cSJames Collins if (empty($this->getConf('customTheme')) === false) { 1089cff245bSJames Collins if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) { 109a8eebd82SJames Collins $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less'; 110a8eebd82SJames Collins } else { 1119cff245bSJames Collins if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) { 112ab45ba71SJames Collins $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css'; 1132b4583abSJames Collins } 114a8eebd82SJames Collins } 1159cff245bSJames Collins if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) { 116ab45ba71SJames Collins $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js'; 117c165b184SJames Collins } 118c165b184SJames Collins } 119c165b184SJames Collins 1203a385f2cSJames Collins if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) { 1219cff245bSJames Collins $icons = []; 122ab45ba71SJames Collins foreach ($MIKIO_ICONS as $icon) { 1239cff245bSJames Collins if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) { 124ab45ba71SJames Collins $icons[] = $icon; 125c165b184SJames Collins 1263a385f2cSJames Collins if (empty($icon['css']) === false) { 1279cff245bSJames Collins if (strpos($icon['css'], '//') === false) { 128a8eebd82SJames Collins $stylesheets[] = $this->baseDir . 'icons/' . $icon['css']; 129ab45ba71SJames Collins } else { 130a8eebd82SJames Collins $stylesheets[] = $icon['css']; 131ab45ba71SJames Collins } 132ab45ba71SJames Collins } 133ab45ba71SJames Collins } 134ab45ba71SJames Collins } 135ab45ba71SJames Collins $MIKIO_ICONS = $icons; 136ab45ba71SJames Collins } else { 137ab45ba71SJames Collins $MIKIO_ICONS = []; 138ab45ba71SJames Collins } 139c165b184SJames Collins 1407864545bSChris MacMackin $scripts[] = $this->baseDir . 'assets/mikio-typeahead.js'; 141ab45ba71SJames Collins $scripts[] = $this->baseDir . 'assets/mikio.js'; 142644fd9f9SJames Collins 1439cff245bSJames Collins if ($this->getConf('useLESS') === true) { 144ab45ba71SJames Collins $stylesheets[] = $this->baseDir . 'assets/mikio.less'; 145644fd9f9SJames Collins } else { 146644fd9f9SJames Collins $stylesheets[] = $this->baseDir . 'assets/mikio.css'; 147644fd9f9SJames Collins } 148644fd9f9SJames Collins 149ab45ba71SJames Collins 150ab45ba71SJames Collins $set = []; 151c165b184SJames Collins foreach ($stylesheets as $style) { 1529cff245bSJames Collins if (in_array($style, $set) === false) { 1533a385f2cSJames Collins if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) { 154ab45ba71SJames Collins $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style); 155ab45ba71SJames Collins } 156ab45ba71SJames Collins 1579cff245bSJames Collins array_unshift($event->data['link'], [ 158c165b184SJames Collins 'type' => 'text/css', 159c165b184SJames Collins 'rel' => 'stylesheet', 160c165b184SJames Collins 'href' => $style 1619cff245bSJames Collins ]); 162c165b184SJames Collins } 163ab45ba71SJames Collins $set[] = $style; 164ab45ba71SJames Collins } 165c165b184SJames Collins 166ab45ba71SJames Collins $set = []; 167c165b184SJames Collins foreach ($scripts as $script) { 1689cff245bSJames Collins if (in_array($script, $set) === false) { 1699cff245bSJames Collins $script_params = [ 170c165b184SJames Collins 'type' => 'text/javascript', 171c165b184SJames Collins '_data' => '', 1728395cdcbSChris MacMackin 'src' => $script 1739cff245bSJames Collins ]; 174c1ecb866SJames Collins 175c1ecb866SJames Collins // equal to or greator than hogfather 176c1ecb866SJames Collins if ($this->dwVersionNumber() >= 20200729) { 177c1ecb866SJames Collins // greator than hogfather - defer always on 178c1ecb866SJames Collins if ($this->dwVersionNumber() >= 20200729) { 179c1ecb866SJames Collins $script_params += ['defer' => 'defer']; 180c1ecb866SJames Collins } else { 181c1ecb866SJames Collins // hogfather - defer always on unless $conf['defer_js'] is false 1829cff245bSJames Collins if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) { 1838395cdcbSChris MacMackin $script_params += ['defer' => 'defer']; 1848395cdcbSChris MacMackin } 185c1ecb866SJames Collins } 186c1ecb866SJames Collins } 187c1ecb866SJames Collins 1888395cdcbSChris MacMackin $event->data['script'][] = $script_params; 1899cff245bSJames Collins }//end if 190ab45ba71SJames Collins $set[] = $script; 1919cff245bSJames Collins }//end foreach 192c165b184SJames Collins } 193c165b184SJames Collins 194c165b184SJames Collins 195c165b184SJames Collins /** 196a8eebd82SJames Collins * Print or return the footer meta data 197c165b184SJames Collins * 1989cff245bSJames Collins * @param boolean $print Print the data to buffer. 1999cff245bSJames Collins * @return string HTML footer meta data 200c165b184SJames Collins */ 2019cff245bSJames Collins public function includeFooterMeta(bool $print = true) 20210b40067Snomadjimbob { 203a8eebd82SJames Collins $html = ''; 204a8eebd82SJames Collins 205a8eebd82SJames Collins if (count($this->footerScript) > 0) { 206a8eebd82SJames Collins $html .= '<script type="text/javascript">function mikioFooterRun() {'; 207a8eebd82SJames Collins foreach ($this->footerScript as $script) { 208a8eebd82SJames Collins $html .= $script . ';'; 209a8eebd82SJames Collins } 210a8eebd82SJames Collins $html .= '}</script>'; 211a8eebd82SJames Collins } 212c165b184SJames Collins 213c165b184SJames Collins 2149cff245bSJames Collins if ($print === true) { 2159cff245bSJames Collins echo $html; 2169cff245bSJames Collins } 217a8eebd82SJames Collins return $html; 218a8eebd82SJames Collins } 219a8eebd82SJames Collins 22095372bffSJames Collins 22195372bffSJames Collins // phpcs:disable Squiz.Commenting.FunctionComment.TypeHintMissing 22295372bffSJames Collins 22395372bffSJames Collins 224a8eebd82SJames Collins /** 225ab45ba71SJames Collins * Retreive and parse theme configuration options 226c165b184SJames Collins * 2279cff245bSJames Collins * @param string $key The configuration key to retreive. 2289cff245bSJames Collins * @param mixed $default If key doesn't exist, return this value. 229ab45ba71SJames Collins * @return mixed parsed value of configuration 230c165b184SJames Collins */ 23195372bffSJames Collins public function getConf(string $key, $default = false) 23210b40067Snomadjimbob { 233c165b184SJames Collins $value = tpl_getConf($key, $default); 234c165b184SJames Collins 2353a385f2cSJames Collins $data = [ 2363a385f2cSJames Collins ['keys' => ['navbarDWMenuType'], 'type' => 'choice', 2373a385f2cSJames Collins 'values' => ['both', 'icons', 'text'] 2383a385f2cSJames Collins ], 2393a385f2cSJames Collins ['keys' => ['navbarDWMenuCombine'], 'type' => 'choice', 2403a385f2cSJames Collins 'values' => ['combine', 'seperate', 'dropdown'] 2413a385f2cSJames Collins ], 2423a385f2cSJames Collins ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'], 2433a385f2cSJames Collins 'type' => 'choice', 2443a385f2cSJames Collins 'values' => ['none', 'custom', 'search', 'dokuwiki'], 2453a385f2cSJames Collins 'default' => [ 2463a385f2cSJames Collins 'navbarPosLeft' => 'none', 2473a385f2cSJames Collins 'navbarPosMiddle' => 'search', 2483a385f2cSJames Collins 'navbarPosRight' => 'dokuwiki' 2493a385f2cSJames Collins ] 2503a385f2cSJames Collins ], 2513a385f2cSJames Collins ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink', 2523a385f2cSJames Collins 'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile', 2533a385f2cSJames Collins 'navbarItemShowAdmin' 2543a385f2cSJames Collins ], 2553a385f2cSJames Collins 'type' => 'choice', 2563a385f2cSJames Collins 'values' => ['always', 'logged in', 'logged out', 'never'] 2573a385f2cSJames Collins ], 2583a385f2cSJames Collins ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'], 2593a385f2cSJames Collins 'type' => 'choice', 2603a385f2cSJames Collins 'values' => ['always', 'never'] 2613a385f2cSJames Collins ], 2623a385f2cSJames Collins ['keys' => ['searchButton'], 'type' => 'choice', 2633a385f2cSJames Collins 'values' => ['icon', 'text'] 2643a385f2cSJames Collins ], 2653a385f2cSJames Collins ['keys' => ['breadcrumbPosition', 'youareherePosition'], 2663a385f2cSJames Collins 'type' => 'choice', 2673a385f2cSJames Collins 'values' => ['top', 'hero', 'page', 'none'] 2683a385f2cSJames Collins ], 2693a385f2cSJames Collins ['keys' => ['youarehereHome'], 'type' => 'choice', 2703a385f2cSJames Collins 'values' => ['page title', 'home', 'icon', 'none'] 2713a385f2cSJames Collins ], 2723a385f2cSJames Collins ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'], 2733a385f2cSJames Collins 'type' => 'choice', 2743a385f2cSJames Collins 'values' => ['none', 'logged in user', 'search', 'content', 'tags'], 2753a385f2cSJames Collins 'default' => [ 2763a385f2cSJames Collins 'sidebarLeftRow1' => 'logged in user', 2773a385f2cSJames Collins 'sidebarLeftRow2' => 'search', 2783a385f2cSJames Collins 'sidebarLeftRow3' => 'content' 2793a385f2cSJames Collins ] 2803a385f2cSJames Collins ], 2813a385f2cSJames Collins ['keys' => ['pageToolsFloating', 'pageToolsFooter'], 2823a385f2cSJames Collins 'type' => 'choice', 2833a385f2cSJames Collins 'values' => ['always', 'none', 'page editors'] 2843a385f2cSJames Collins ], 2853a385f2cSJames Collins ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink', 2863a385f2cSJames Collins 'pageToolsShowTop' 2873a385f2cSJames Collins ], 2883a385f2cSJames Collins 'type' => 'choice', 2893a385f2cSJames Collins 'values' => ['always', 'logged in', 'logged out', 'never'] 2903a385f2cSJames Collins ], 2913a385f2cSJames Collins ['keys' => ['showNotifications'], 'type' => 'choice', 2923a385f2cSJames Collins 'values' => ['admin', 'always', 'none'] 2933a385f2cSJames Collins ], 2943a385f2cSJames Collins ['keys' => ['licenseType'], 'type' => 'choice', 2953a385f2cSJames Collins 'values' => ['badge', 'button', 'none'] 2963a385f2cSJames Collins ], 2973a385f2cSJames Collins ['keys' => ['navbarUseTitleIcon'], 'type' => 'bool'], 2983a385f2cSJames Collins ['keys' => ['navbarUseTitleText'], 'type' => 'bool'], 2993a385f2cSJames Collins ['keys' => ['navbarUseTaglineText'], 'type' => 'bool'], 3003a385f2cSJames Collins ['keys' => ['navbarShowSub'], 'type' => 'bool'], 3013a385f2cSJames Collins ['keys' => ['heroTitle'], 'type' => 'bool'], 3023a385f2cSJames Collins ['keys' => ['heroImagePropagation'], 'type' => 'bool'], 3033a385f2cSJames Collins ['keys' => ['breadcrumbPrefix'], 'type' => 'bool'], 3043a385f2cSJames Collins ['keys' => ['breadcrumbSep'], 'type' => 'bool'], 3053a385f2cSJames Collins ['keys' => ['youareherePrefix'], 'type' => 'bool'], 3063a385f2cSJames Collins ['keys' => ['youarehereSep'], 'type' => 'bool'], 3073a385f2cSJames Collins ['keys' => ['sidebarShowLeft'], 'type' => 'bool'], 3083a385f2cSJames Collins ['keys' => ['sidebarShowRight'], 'type' => 'bool'], 3093a385f2cSJames Collins ['keys' => ['tocFull'], 'type' => 'bool'], 3103a385f2cSJames Collins ['keys' => ['footerSearch'], 'type' => 'bool'], 3113a385f2cSJames Collins ['keys' => ['licenseImageOnly'], 'type' => 'bool'], 3123a385f2cSJames Collins ['keys' => ['includePageUseACL'], 'type' => 'bool'], 3133a385f2cSJames Collins ['keys' => ['includePagePropagate'], 'type' => 'bool'], 3143a385f2cSJames Collins ['keys' => ['youarehereHideHome'], 'type' => 'bool'], 3153a385f2cSJames Collins ['keys' => ['tagsConsolidate'], 'type' => 'bool'], 3163a385f2cSJames Collins ['keys' => ['footerInPage'], 'type' => 'bool'], 3173a385f2cSJames Collins ['keys' => ['sidebarMobileDefaultCollapse'], 'type' => 'bool'], 3183a385f2cSJames Collins ['keys' => ['sidebarAlwaysShowLeft'], 'type' => 'bool'], 3193a385f2cSJames Collins ['keys' => ['sidebarAlwaysShowRight'], 'type' => 'bool'], 3203a385f2cSJames Collins ['keys' => ['searchUseTypeahead'], 'type' => 'bool'], 321*12030b10SJames Collins ['keys' => ['showLightDark'], 'type' => 'bool'], 3223a385f2cSJames Collins ['keys' => ['youarehereShowLast'], 'type' => 'int'], 3233a385f2cSJames Collins 3243a385f2cSJames Collins ['keys' => ['iconTag'], 'type' => 'string'], 3253a385f2cSJames Collins ['keys' => ['customTheme'], 'type' => 'string'], 3263a385f2cSJames Collins ['keys' => ['navbarCustomMenuText'], 'type' => 'string'], 3273a385f2cSJames Collins ['keys' => ['breadcrumbPrefixText'], 'type' => 'string'], 3283a385f2cSJames Collins ['keys' => ['breadcrumbSepText'], 'type' => 'string'], 3293a385f2cSJames Collins ['keys' => ['youareherePrefixText'], 'type' => 'string'], 3303a385f2cSJames Collins ['keys' => ['youarehereSepText'], 'type' => 'string'], 3313a385f2cSJames Collins ['keys' => ['footerCustomMenuText'], 'type' => 'string'], 3323a385f2cSJames Collins ['keys' => ['brandURLGuest'], 'type' => 'string'], 3333a385f2cSJames Collins ['keys' => ['brandURLUser'], 'type' => 'string'], 3343a385f2cSJames Collins 3353a385f2cSJames Collins ['keys' => ['useLESS'], 'type' => 'less'], 3363a385f2cSJames Collins ]; 3373a385f2cSJames Collins 3383a385f2cSJames Collins foreach ($data as $row) { 3393a385f2cSJames Collins // does not check case.... 3403a385f2cSJames Collins if (in_array($key, $row['keys']) === true) { 34195372bffSJames Collins if (array_key_exists('type', $row) === true) { 3423a385f2cSJames Collins switch ($row['type']) { 3433a385f2cSJames Collins case 'bool': 3443a385f2cSJames Collins return (bool) $value; 3453a385f2cSJames Collins case 'int': 3463a385f2cSJames Collins return (int) $value; 3473a385f2cSJames Collins case 'string': 3483a385f2cSJames Collins return $value; 3493a385f2cSJames Collins case 'less': 35029118ed7SJames Collins $value = (bool) $value; 351a8df40efSJames Collins $lessAvailable = true; 352a8df40efSJames Collins 353a8df40efSJames Collins // check for less library 354a8df40efSJames Collins $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3559cff245bSJames Collins if (file_exists($lesscLib) === false) { 356a8df40efSJames Collins $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3579cff245bSJames Collins } 3589cff245bSJames Collins if (file_exists($lesscLib) === false) { 359a8df40efSJames Collins $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3609cff245bSJames Collins } 3619cff245bSJames Collins if (file_exists($lesscLib) === false) { 3629cff245bSJames Collins $lesscLib = $_SERVER['DOCUMENT_ROOT'] . 3639cff245bSJames Collins '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3649cff245bSJames Collins } 3659cff245bSJames Collins if (file_exists($lesscLib) === false) { 366a8df40efSJames Collins $lessAvailable = false; 367a8df40efSJames Collins } 368a8df40efSJames Collins 369a8df40efSJames Collins // check for ctype extensions 3709cff245bSJames Collins if (function_exists('ctype_digit') === false) { 371a8df40efSJames Collins $lessAvailable = false; 372a8df40efSJames Collins } 373a8df40efSJames Collins 3749cff245bSJames Collins if ($value === true && $lessAvailable === false) { 375a8df40efSJames Collins $this->lessIgnored = true; 37629118ed7SJames Collins $value = false; 37729118ed7SJames Collins } 3783a385f2cSJames Collins 3793a385f2cSJames Collins return $value; 3809cff245bSJames Collins }//end switch 3813a385f2cSJames Collins }//end if 3823a385f2cSJames Collins 3833a385f2cSJames Collins if (in_array($value, $row['values']) === true) { 3843a385f2cSJames Collins return $value; 3853a385f2cSJames Collins } 3863a385f2cSJames Collins 3873a385f2cSJames Collins if (array_key_exists('default', $row) === true) { 3883a385f2cSJames Collins if (is_array($row['default']) === true) { 3893a385f2cSJames Collins if (array_key_exists($key, $row['default']) === true) { 3903a385f2cSJames Collins return $row['default'][$key]; 3913a385f2cSJames Collins } 3923a385f2cSJames Collins } else { 3933a385f2cSJames Collins return $row['default']; 3943a385f2cSJames Collins } 3953a385f2cSJames Collins } 3963a385f2cSJames Collins 3973a385f2cSJames Collins return reset($row['values']); 3983a385f2cSJames Collins }//end if 3993a385f2cSJames Collins }//end foreach 400c165b184SJames Collins 401c165b184SJames Collins return $value; 402c165b184SJames Collins } 403c165b184SJames Collins 404c165b184SJames Collins 40595372bffSJames Collins // phpcs:enable 40695372bffSJames Collins 40795372bffSJames Collins 408c165b184SJames Collins /** 409a8eebd82SJames Collins * Check if a page exist in directory or namespace 410c165b184SJames Collins * 4119cff245bSJames Collins * @param string $page Page/namespace to search. 412a8eebd82SJames Collins * @return boolean if page exists 413c165b184SJames Collins */ 4149cff245bSJames Collins public function pageExists(string $page) 41510b40067Snomadjimbob { 416ab45ba71SJames Collins ob_start(); 417a8eebd82SJames Collins tpl_includeFile($page . '.html'); 418ab45ba71SJames Collins $html = ob_get_contents(); 419ab45ba71SJames Collins ob_end_clean(); 420a8eebd82SJames Collins 4213a385f2cSJames Collins if (empty($html) === false) { 4229cff245bSJames Collins return true; 4239cff245bSJames Collins } 424a8eebd82SJames Collins 425a8eebd82SJames Collins $useACL = $this->getConf('includePageUseACL'); 426a8eebd82SJames Collins $propagate = $this->getConf('includePagePropagate'); 427a8eebd82SJames Collins 4289cff245bSJames Collins if ($propagate === true) { 4299cff245bSJames Collins if (page_findnearest($page, $useACL) !== false) { 4309cff245bSJames Collins return true; 4319cff245bSJames Collins } 4329cff245bSJames Collins } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) { 4339cff245bSJames Collins return true; 434ab45ba71SJames Collins } 435ab45ba71SJames Collins 4369cff245bSJames Collins return false; 437ab45ba71SJames Collins } 438ab45ba71SJames Collins 439a8eebd82SJames Collins 440c165b184SJames Collins /** 441a8eebd82SJames Collins * Print or return page from directory or namespace 4422b4583abSJames Collins * 4439cff245bSJames Collins * @param string $page Page/namespace to include. 4449cff245bSJames Collins * @param boolean $print Print content. 4459cff245bSJames Collins * @param boolean $parse Parse content before printing/returning. 4469cff245bSJames Collins * @param string $classWrapper Wrap page in a div with class. 447ab45ba71SJames Collins * @return string contents of page found 4482b4583abSJames Collins */ 4499cff245bSJames Collins public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '') 4502b4583abSJames Collins { 451a8eebd82SJames Collins ob_start(); 452a8eebd82SJames Collins tpl_includeFile($page . '.html'); 453a8eebd82SJames Collins $html = ob_get_contents(); 454a8eebd82SJames Collins ob_end_clean(); 455a8eebd82SJames Collins 4563a385f2cSJames Collins if (empty($html) === true) { 457a8eebd82SJames Collins $useACL = $this->getConf('includePageUseACL'); 458a8eebd82SJames Collins $propagate = $this->getConf('includePagePropagate'); 459ab45ba71SJames Collins $html = ''; 4602b4583abSJames Collins 461ab45ba71SJames Collins $html = tpl_include_page($page, false, $propagate, $useACL); 462ab45ba71SJames Collins } 4632b4583abSJames Collins 4643a385f2cSJames Collins if (empty($html) === false && $parse === true) { 465ab45ba71SJames Collins $html = $this->parseContent($html); 466ab45ba71SJames Collins } 4672b4583abSJames Collins 4683a385f2cSJames Collins if (empty($classWrapper) === false && empty($html) === false) { 4699cff245bSJames Collins $html = '<div class="' . $classWrapper . '">' . $html . '</div>'; 4709cff245bSJames Collins } 4712b4583abSJames Collins 4729cff245bSJames Collins if ($print === true) { 4739cff245bSJames Collins echo $html; 4749cff245bSJames Collins } 475ab45ba71SJames Collins return $html; 4762b4583abSJames Collins } 4772b4583abSJames Collins 478a8eebd82SJames Collins 479a8eebd82SJames Collins /** 480a8eebd82SJames Collins * Print or return logged in user information 481a8eebd82SJames Collins * 4829cff245bSJames Collins * @param boolean $print Print content. 483a8eebd82SJames Collins * @return string user information 484a8eebd82SJames Collins */ 4859cff245bSJames Collins public function includeLoggedIn(bool $print = true) 48610b40067Snomadjimbob { 487a8eebd82SJames Collins $html = ''; 488a8eebd82SJames Collins 4899cff245bSJames Collins if (empty($_SERVER['REMOTE_USER']) === false) { 490a8eebd82SJames Collins $html .= '<div class="mikio-user-info">'; 491a8eebd82SJames Collins ob_start(); 492a8eebd82SJames Collins tpl_userinfo(); 493a8eebd82SJames Collins $html .= ob_get_contents(); 494a8eebd82SJames Collins ob_end_clean(); 495a8eebd82SJames Collins $html .= '</div>'; 4962b4583abSJames Collins } 497a8eebd82SJames Collins 4989cff245bSJames Collins if ($print === true) { 4999cff245bSJames Collins echo $html; 5009cff245bSJames Collins } 501a8eebd82SJames Collins return $html; 5022b4583abSJames Collins } 5032b4583abSJames Collins 5042b4583abSJames Collins 505a8eebd82SJames Collins /** 506a8eebd82SJames Collins * Print or return DokuWiki Menu 507a8eebd82SJames Collins * 5089cff245bSJames Collins * @param boolean $print Print content. 509a8eebd82SJames Collins * @return string contents of the menu 510a8eebd82SJames Collins */ 5119cff245bSJames Collins public function includeDWMenu(bool $print = true) 51210b40067Snomadjimbob { 5132b4583abSJames Collins global $lang; 5142b4583abSJames Collins global $USERINFO; 515c165b184SJames Collins 5169cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 517a8eebd82SJames Collins $html = '<ul class="mikio-nav">'; 5182b4583abSJames Collins 519ab45ba71SJames Collins $pageToolsMenu = []; 520ab45ba71SJames Collins $siteToolsMenu = []; 521ab45ba71SJames Collins $userToolsMenu = []; 522c165b184SJames Collins 523ab45ba71SJames Collins $showIcons = ($this->getConf('navbarDWMenuType') != 'text'); 524ab45ba71SJames Collins $showText = ($this->getConf('navbarDWMenuType') != 'icons'); 525ab45ba71SJames Collins $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate'); 5262b4583abSJames Collins 5272b4583abSJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 5282b4583abSJames Collins foreach ($items as $item) { 5299cff245bSJames Collins if ($item->getType() !== 'top') { 530ab45ba71SJames Collins $itemHtml = ''; 5312b4583abSJames Collins 532905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5339cff245bSJames Collins if ( 5343a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 5353a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 5363a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5379cff245bSJames Collins ) { 5389cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . 5399cff245bSJames Collins ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 5409cff245bSJames Collins if ($showIcons === true) { 5419cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 5429cff245bSJames Collins } 5439cff245bSJames Collins if ($showText === true || $isDropDown === true) { 5449cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 5459cff245bSJames Collins } 546ab45ba71SJames Collins $itemHtml .= '</a>'; 547ab45ba71SJames Collins 548ab45ba71SJames Collins $pageToolsMenu[] = $itemHtml; 5492b4583abSJames Collins } 5509cff245bSJames Collins }//end if 5519cff245bSJames Collins }//end foreach 5522b4583abSJames Collins 553ab45ba71SJames Collins $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action'); 554ab45ba71SJames Collins foreach ($items as $item) { 555ab45ba71SJames Collins $itemHtml = ''; 5562b4583abSJames Collins 557905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5589cff245bSJames Collins if ( 5593a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 5603a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 5613a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5629cff245bSJames Collins ) { 5639cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' . 5649cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 5659cff245bSJames Collins if ($showIcons === true) { 5669cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 5679cff245bSJames Collins } 5689cff245bSJames Collins if ($showText === true || $isDropDown === true) { 5699cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 5709cff245bSJames Collins } 571ab45ba71SJames Collins $itemHtml .= '</a>'; 5722b4583abSJames Collins 573ab45ba71SJames Collins $siteToolsMenu[] = $itemHtml; 5742b4583abSJames Collins } 5759cff245bSJames Collins }//end foreach 5762b4583abSJames Collins 577ab45ba71SJames Collins $items = (new \dokuwiki\Menu\UserMenu())->getItems('action'); 578ab45ba71SJames Collins foreach ($items as $item) { 579ab45ba71SJames Collins $itemHtml = ''; 580ab45ba71SJames Collins 581905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5829cff245bSJames Collins if ( 5833a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 5843a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 5853a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5869cff245bSJames Collins ) { 5879cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' . 5889cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 5899cff245bSJames Collins if ($showIcons === true) { 5909cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 5919cff245bSJames Collins } 5929cff245bSJames Collins if ($showText === true || $isDropDown === true) { 5939cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 5949cff245bSJames Collins } 595ab45ba71SJames Collins $itemHtml .= '</a>'; 596ab45ba71SJames Collins 597ab45ba71SJames Collins $userToolsMenu[] = $itemHtml; 598ab45ba71SJames Collins } 5999cff245bSJames Collins }//end foreach 600ab45ba71SJames Collins 601ab45ba71SJames Collins 602ab45ba71SJames Collins switch ($this->getConf('navbarDWMenuCombine')) { 603ab45ba71SJames Collins case 'dropdown': 604ab45ba71SJames Collins $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">'; 6059cff245bSJames Collins $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button" 6069cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6079cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('file') : '') . 6089cff245bSJames Collins ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] . 6099cff245bSJames Collins '</span>') . '</a>'; 610a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 611ab45ba71SJames Collins 612ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 613ab45ba71SJames Collins $html .= $item; 614ab45ba71SJames Collins } 615ab45ba71SJames Collins 616ab45ba71SJames Collins $html .= '</div>'; 617ab45ba71SJames Collins $html .= '</li>'; 618ab45ba71SJames Collins 619a8eebd82SJames Collins $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">'; 6209cff245bSJames Collins $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button" 6219cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6229cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('gear') : '') . 6239cff245bSJames Collins ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' . 6249cff245bSJames Collins $lang['site_tools'] . '</span>') . '</a>'; 625a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 626ab45ba71SJames Collins 627ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 628ab45ba71SJames Collins $html .= $item; 629ab45ba71SJames Collins } 630ab45ba71SJames Collins 631ab45ba71SJames Collins $html .= '</div>'; 632ab45ba71SJames Collins $html .= '</li>'; 633ab45ba71SJames Collins 634a8eebd82SJames Collins $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">'; 6359cff245bSJames Collins $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button" 6369cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6379cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('user') : '') . 6389cff245bSJames Collins ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' . 6399cff245bSJames Collins $lang['user_tools'] . '</span>') . '</a>'; 640a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 641ab45ba71SJames Collins 642ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 643ab45ba71SJames Collins $html .= $item; 644ab45ba71SJames Collins } 645ab45ba71SJames Collins 646ab45ba71SJames Collins $html .= '</div>'; 647ab45ba71SJames Collins $html .= '</li>'; 648ab45ba71SJames Collins 649ab45ba71SJames Collins break; 650ab45ba71SJames Collins 651ab45ba71SJames Collins case 'combine': 652ab45ba71SJames Collins $html .= '<li class="mikio-nav-dropdown">'; 6539cff245bSJames Collins $html .= '<a class="mikio-nav-link" href="#">' . 6549cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') . 6559cff245bSJames Collins ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' . 6569cff245bSJames Collins tpl_getLang('tools-menu') . '</span>') . '</a>'; 657a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 658ab45ba71SJames Collins 659ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>'; 660ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 661ab45ba71SJames Collins $html .= $item; 662ab45ba71SJames Collins } 663ab45ba71SJames Collins 664ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 665ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>'; 666ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 667ab45ba71SJames Collins $html .= $item; 668ab45ba71SJames Collins } 669ab45ba71SJames Collins 670ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 671ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>'; 672ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 673ab45ba71SJames Collins $html .= $item; 674ab45ba71SJames Collins } 675ab45ba71SJames Collins 676ab45ba71SJames Collins $html .= '</div>'; 677ab45ba71SJames Collins $html .= '</li>'; 678ab45ba71SJames Collins break; 679ab45ba71SJames Collins 680ab45ba71SJames Collins default: // seperate 681ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 682a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 683ab45ba71SJames Collins } 684ab45ba71SJames Collins 685ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 686a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 687a8eebd82SJames Collins } 688a8eebd82SJames Collins 689a8eebd82SJames Collins foreach ($userToolsMenu as $item) { 690a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 691ab45ba71SJames Collins } 692ab45ba71SJames Collins 693ab45ba71SJames Collins break; 6949cff245bSJames Collins }//end switch 695ab45ba71SJames Collins 696*12030b10SJames Collins if ($this->getConf('showLightDark') === true) { 697*12030b10SJames Collins $html .= '<li class="mikio-theme-mode"><a href="#" class="mikio-control mikio-button mikio-theme-mode-button"></a></li>'; 698*12030b10SJames Collins } 699*12030b10SJames Collins 700ab45ba71SJames Collins $html .= '</ul>'; 701ab45ba71SJames Collins 7029cff245bSJames Collins if ($print === true) { 7039cff245bSJames Collins echo $html; 7049cff245bSJames Collins } 705a8eebd82SJames Collins return $html; 706a8eebd82SJames Collins } 707a8eebd82SJames Collins 708a8eebd82SJames Collins 709a8eebd82SJames Collins /** 710a8eebd82SJames Collins * Create a nav element from a string. <uri>|<title>; 711a8eebd82SJames Collins * 7129cff245bSJames Collins * @param string $str String to generate nav. 713a8eebd82SJames Collins * @return string nav elements generated 714a8eebd82SJames Collins */ 7159cff245bSJames Collins public function stringToNav(string $str) 71610b40067Snomadjimbob { 717a8eebd82SJames Collins $html = ''; 718a8eebd82SJames Collins 7193a385f2cSJames Collins if (empty($str) === false) { 720a8eebd82SJames Collins $items = explode(';', $str); 721a8eebd82SJames Collins if (count($items) > 0) { 722a8eebd82SJames Collins $html .= '<ul class="mikio-nav">'; 723a8eebd82SJames Collins foreach ($items as $item) { 724a8eebd82SJames Collins $parts = explode('|', $item); 725a8eebd82SJames Collins if ($parts > 1) { 7269cff245bSJames Collins $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' . 7279cff245bSJames Collins strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) . 7289cff245bSJames Collins '</a></li>'; 729a8eebd82SJames Collins } 730a8eebd82SJames Collins } 731a8eebd82SJames Collins $html .= '</ul>'; 732a8eebd82SJames Collins } 7332b4583abSJames Collins } 7342b4583abSJames Collins 735ab45ba71SJames Collins return $html; 7362b4583abSJames Collins } 7372b4583abSJames Collins 738a8eebd82SJames Collins /** 739ab45ba71SJames Collins * print or return the main navbar 7402b4583abSJames Collins * 7419cff245bSJames Collins * @param boolean $print Print the navbar. 7429cff245bSJames Collins * @param boolean $showSub Include the sub navbar. 743ab45ba71SJames Collins * @return string generated content 7442b4583abSJames Collins */ 7459cff245bSJames Collins public function includeNavbar(bool $print = true, bool $showSub = false) 74610b40067Snomadjimbob { 747b39ad16dSJames Collins global $conf, $USERINFO; 748d3d7d2b7SJames Collins 749d3d7d2b7SJames Collins $homeUrl = wl(); 750d3d7d2b7SJames Collins 7519cff245bSJames Collins if (plugin_isdisabled('showpageafterlogin') === false) { 752d3d7d2b7SJames Collins $p = &plugin_load('action', 'showpageafterlogin'); 7533a385f2cSJames Collins if (empty($p) === false) { 7549cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 755d3d7d2b7SJames Collins $homeUrl = wl($p->getConf('page_after_login')); 756d3d7d2b7SJames Collins } 757d3d7d2b7SJames Collins } 758b39ad16dSJames Collins } else { 7599cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 760b39ad16dSJames Collins $url = $this->getConf('brandURLUser'); 761b39ad16dSJames Collins if (strlen($url) > 0) { 762b39ad16dSJames Collins $homeUrl = $url; 763d3d7d2b7SJames Collins } 764b39ad16dSJames Collins } else { 765b39ad16dSJames Collins $url = $this->getConf('brandURLGuest'); 766b39ad16dSJames Collins if (strlen($url) > 0) { 767b39ad16dSJames Collins $homeUrl = $url; 768b39ad16dSJames Collins } 769b39ad16dSJames Collins } 770b39ad16dSJames Collins } 771d3d7d2b7SJames Collins 772ab45ba71SJames Collins $html = ''; 77347161538SJames Collins 7749cff245bSJames Collins $html .= '<nav class="mikio-navbar' . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') . 7759cff245bSJames Collins '">'; 776f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 777d3d7d2b7SJames Collins $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">'; 7789cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) { 779ab45ba71SJames Collins // Brand image 7809cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true) { 7819cff245bSJames Collins $logo = $this->getMediaFile('logo', false); 7829cff245bSJames Collins ; 7833a385f2cSJames Collins if (empty($logo) === false) { 784f0241fc4SJames Collins $width = $this->getConf('navbarTitleIconWidth'); 785f0241fc4SJames Collins $height = $this->getConf('navbarTitleIconHeight'); 786f0241fc4SJames Collins $styles = ''; 787f0241fc4SJames Collins 788f0241fc4SJames Collins if (strlen($width) > 0 || strlen($height) > 0) { 7899cff245bSJames Collins if (ctype_digit($width) === true) { 790f0241fc4SJames Collins $styles .= 'max-width:' . intval($width) . 'px;'; 7919cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) { 792f0241fc4SJames Collins $styles .= 'max-width:' . $width . ';'; 7939cff245bSJames Collins } elseif (strcasecmp($width, 'none') === 0) { 7947a92c19bSJames Collins $styles .= 'max-width:none;'; 795f0241fc4SJames Collins } 796f0241fc4SJames Collins 7979cff245bSJames Collins if (ctype_digit($height) === true) { 798f0241fc4SJames Collins $styles .= 'max-height:' . intval($height) . 'px;'; 7999cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) { 800f0241fc4SJames Collins $styles .= 'max-height:' . $height . ';'; 8019cff245bSJames Collins } elseif (strcasecmp($height, 'none') === 0) { 8027a92c19bSJames Collins $styles .= 'max-height:none;'; 803f0241fc4SJames Collins } 804f0241fc4SJames Collins 805f0241fc4SJames Collins if (strlen($styles) > 0) { 806f0241fc4SJames Collins $styles = ' style="' . $styles . '"'; 807f0241fc4SJames Collins } 8089cff245bSJames Collins }//end if 809f0241fc4SJames Collins 810f0241fc4SJames Collins $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>'; 8119cff245bSJames Collins }//end if 8129cff245bSJames Collins }//end if 813ab45ba71SJames Collins 814ab45ba71SJames Collins // Brand title 8159cff245bSJames Collins if ($this->getConf('navbarUseTitleText') === true) { 816ab45ba71SJames Collins $html .= '<div class="mikio-navbar-brand-title">'; 817a8eebd82SJames Collins $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>'; 8189cff245bSJames Collins if ($this->getConf('navbarUseTaglineText') === true) { 819a8eebd82SJames Collins $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>'; 820ab45ba71SJames Collins } 821ab45ba71SJames Collins $html .= '</div>'; 822ab45ba71SJames Collins } 8239cff245bSJames Collins }//end if 824ab45ba71SJames Collins $html .= '</a>'; 825660b2c71SJames Collins $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>'; 826ab45ba71SJames Collins 827ab45ba71SJames Collins // Menus 828ab45ba71SJames Collins $html .= '<div class="mikio-navbar-collapse">'; 829ab45ba71SJames Collins 8309cff245bSJames Collins $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'), 8319cff245bSJames Collins $this->getConf('navbarPosRight', 'none') 8329cff245bSJames Collins ]; 833a8eebd82SJames Collins foreach ($menus as $menuType) { 834a8eebd82SJames Collins switch ($menuType) { 835a8eebd82SJames Collins case 'custom': 836a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', '')); 837a8eebd82SJames Collins break; 838a8eebd82SJames Collins case 'search': 839ab45ba71SJames Collins $html .= '<div class="mikio-nav-item">'; 840ab45ba71SJames Collins $html .= $this->includeSearch(false); 841ab45ba71SJames Collins $html .= '</div>'; 842a8eebd82SJames Collins break; 843a8eebd82SJames Collins case 'dokuwiki': 8449cff245bSJames Collins $html .= $this->includeDWMenu(false); 845a8eebd82SJames Collins break; 846a8eebd82SJames Collins } 847a8eebd82SJames Collins } 848ab45ba71SJames Collins 849ab45ba71SJames Collins $html .= '</div>'; 850f8039bf2SJames Collins $html .= '</div>'; 851ab45ba71SJames Collins $html .= '</nav>'; 852ab45ba71SJames Collins 853a8eebd82SJames Collins // Sub Navbar 8549cff245bSJames Collins if ($showSub === true) { 8559cff245bSJames Collins $sub = $this->includePage('submenu', false); 8563a385f2cSJames Collins if (empty($sub) === false) { 8579cff245bSJames Collins $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>'; 8589cff245bSJames Collins } 859ab45ba71SJames Collins } 860ab45ba71SJames Collins 8619cff245bSJames Collins if ($print === true) { 8629cff245bSJames Collins echo $html; 8639cff245bSJames Collins } 864ab45ba71SJames Collins return $html; 865ab45ba71SJames Collins } 866ab45ba71SJames Collins 867ab45ba71SJames Collins 868a8eebd82SJames Collins /** 869a8eebd82SJames Collins * Is there a sidebar 870a8eebd82SJames Collins * 8719cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 872a8eebd82SJames Collins * @return boolean if sidebar exists 873a8eebd82SJames Collins */ 8749cff245bSJames Collins public function sidebarExists(string $prefix = '') 87510b40067Snomadjimbob { 876a8eebd82SJames Collins global $conf; 877a8eebd82SJames Collins 8783a385f2cSJames Collins if (strcasecmp($prefix, 'left') === 0) { 8799cff245bSJames Collins $prefix = ''; 8809cff245bSJames Collins } 881a8eebd82SJames Collins 882a8eebd82SJames Collins return $this->pageExists($conf['sidebar' . $prefix]); 883a8eebd82SJames Collins } 884a8eebd82SJames Collins 885a8eebd82SJames Collins 886a8eebd82SJames Collins /** 887ab45ba71SJames Collins * Print or return the sidebar content 888ab45ba71SJames Collins * 8899cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 8909cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 8919cff245bSJames Collins * @param boolean $parse Parse the content. 892ab45ba71SJames Collins * @return string generated content 893ab45ba71SJames Collins */ 8949cff245bSJames Collins public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true) 89510b40067Snomadjimbob { 896ab45ba71SJames Collins global $conf, $ID; 897ab45ba71SJames Collins 898ab45ba71SJames Collins $html = ''; 899ab45ba71SJames Collins $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix)); 900ab45ba71SJames Collins $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix)); 901ab45ba71SJames Collins 9023a385f2cSJames Collins if (empty($confPrefix) === true) { 9039cff245bSJames Collins $confPrefix = 'Left'; 9049cff245bSJames Collins } 9053a385f2cSJames Collins if (strcasecmp($prefix, 'Left') === 0) { 9069cff245bSJames Collins $prefix = ''; 9079cff245bSJames Collins } 908ab45ba71SJames Collins 9093a385f2cSJames Collins empty($sidebarPage = $conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar']; 910ab45ba71SJames Collins 9119cff245bSJames Collins if ( 9129cff245bSJames Collins $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false && 9139cff245bSJames Collins p_get_metadata($ID, 'nosidebar', false) === false 9149cff245bSJames Collins ) { 9159cff245bSJames Collins $content = $this->includePage($sidebarPage . 'header', false); 9163a385f2cSJames Collins if (empty($content) === false) { 9179cff245bSJames Collins $html .= '<div class="mikio-sidebar-header">' . $content . '</div>'; 9189cff245bSJames Collins } 919ab45ba71SJames Collins 9203a385f2cSJames Collins if (empty($prefix) === true) { 9219cff245bSJames Collins $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'), 9229cff245bSJames Collins $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4') 9239cff245bSJames Collins ]; 924ab45ba71SJames Collins 925a8eebd82SJames Collins foreach ($rows as $row) { 926a8eebd82SJames Collins switch ($row) { 927a8eebd82SJames Collins case 'search': 9289cff245bSJames Collins $html .= $this->includeSearch(false); 929a8eebd82SJames Collins break; 930a8eebd82SJames Collins case 'logged in user': 9319cff245bSJames Collins $html .= $this->includeLoggedIn(false); 932a8eebd82SJames Collins break; 933a8eebd82SJames Collins case 'content': 9349cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 9353a385f2cSJames Collins if (empty($content) === false) { 9369cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 9379cff245bSJames Collins } 938a8eebd82SJames Collins break; 939a8eebd82SJames Collins case 'tags': 940a8eebd82SJames Collins $html .= '<div class="mikio-tags"></div>'; 941a8eebd82SJames Collins } 942a8eebd82SJames Collins } 943a8eebd82SJames Collins } else { 9449cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 9453a385f2cSJames Collins if (empty($content) === false) { 9469cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 9479cff245bSJames Collins } 9489cff245bSJames Collins }//end if 9499cff245bSJames Collins 9509cff245bSJames Collins $content = $this->includePage($sidebarPage . 'footer', false); 9513a385f2cSJames Collins if (empty($content) === false) { 9529cff245bSJames Collins $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>'; 9539cff245bSJames Collins } 9549cff245bSJames Collins }//end if 9559cff245bSJames Collins 9563a385f2cSJames Collins if (empty($html) === true) { 9573a385f2cSJames Collins if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) { 9589cff245bSJames Collins $html = ' '; 9599cff245bSJames Collins } 9609cff245bSJames Collins if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) { 9619cff245bSJames Collins $html = ' '; 9629cff245bSJames Collins } 963a8eebd82SJames Collins } 964ab45ba71SJames Collins 9653a385f2cSJames Collins if (empty($html) === false) { 9663a385f2cSJames Collins empty($html = '<aside class="mikio-sidebar mikio-sidebar-' . ($prefix) === true ? 'left' : $prefix) . 9679cff245bSJames Collins '"><a class="mikio-sidebar-toggle' . 9689cff245bSJames Collins ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' . 9699cff245bSJames Collins tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' . 9709cff245bSJames Collins $html . '</div></aside>'; 971ab45ba71SJames Collins } 972ab45ba71SJames Collins 9739cff245bSJames Collins if ($parse === true) { 9749cff245bSJames Collins $html = $this->includeIcons($html); 9753a04a100SJames Collins } 9769cff245bSJames Collins if ($print === true) { 9779cff245bSJames Collins echo $html; 978ab45ba71SJames Collins } 979ab45ba71SJames Collins return $html; 980ab45ba71SJames Collins } 981ab45ba71SJames Collins 982ab45ba71SJames Collins 983a8eebd82SJames Collins /** 984ab45ba71SJames Collins * Print or return the page tools content 985ab45ba71SJames Collins * 9869cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 9879cff245bSJames Collins * @param boolean $includeId Include the dw__pagetools id in the element. 988ab45ba71SJames Collins * @return string generated content 989ab45ba71SJames Collins */ 9909cff245bSJames Collins public function includePageTools(bool $print = true, bool $includeId = false) 99110b40067Snomadjimbob { 9921293ce10SJames Collins global $USERINFO; 9931293ce10SJames Collins 9949cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 995ab45ba71SJames Collins $html = ''; 996ab45ba71SJames Collins 9979cff245bSJames Collins $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">'; 998b9c0582bSJames Collins $html .= '<ul class="tools">'; 999ab45ba71SJames Collins 1000ab45ba71SJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 1001ab45ba71SJames Collins foreach ($items as $item) { 10029cff245bSJames Collins $classes = []; 10033fd763a0SJames Collins $classes[] = $item->getType(); 10043fd763a0SJames Collins $attr = $item->getLinkAttributes(); 10053fd763a0SJames Collins 10069cff245bSJames Collins if (empty($attr['class']) === false) { 10073fd763a0SJames Collins $classes = array_merge($classes, explode(' ', $attr['class'])); 1008ab45ba71SJames Collins } 1009ab45ba71SJames Collins 10103fd763a0SJames Collins $classes = array_unique($classes); 10113fd763a0SJames Collins 10121293ce10SJames Collins $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType())); 10139cff245bSJames Collins if ( 10143a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 10153a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 10163a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true)) 10179cff245bSJames Collins ) { 10183fd763a0SJames Collins $html .= '<li class="' . implode(' ', $classes) . '">'; 10199cff245bSJames Collins $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' . 10209cff245bSJames Collins $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) . 10219cff245bSJames Collins '</div><span class="a11y">' . $item->getLabel() . '</span></a>'; 10223fd763a0SJames Collins $html .= '</li>'; 10233fd763a0SJames Collins } 10249cff245bSJames Collins }//end foreach 10253fd763a0SJames Collins 10263fd763a0SJames Collins $html .= '</ul>'; 1027ab45ba71SJames Collins $html .= '</nav>'; 1028ab45ba71SJames Collins 10299cff245bSJames Collins if ($print === true) { 10309cff245bSJames Collins echo $html; 10319cff245bSJames Collins } 1032ab45ba71SJames Collins return $html; 1033ab45ba71SJames Collins } 1034ab45ba71SJames Collins 1035ab45ba71SJames Collins 1036a8eebd82SJames Collins /** 1037a8eebd82SJames Collins * Print or return the search bar 1038a8eebd82SJames Collins * 10399cff245bSJames Collins * @param boolean $print Print content. 1040a8eebd82SJames Collins * @return string contents of the search bar 1041a8eebd82SJames Collins */ 10429cff245bSJames Collins public function includeSearch(bool $print = true) 104310b40067Snomadjimbob { 10449cff245bSJames Collins global $lang, $ID, $ACT, $QUERY; 1045ab45ba71SJames Collins $html = ''; 1046ab45ba71SJames Collins 10479cff245bSJames Collins $html .= '<form class="mikio-search search" action="' . wl() . 10489cff245bSJames Collins '" accept-charset="utf-8" method="get" role="search">'; 1049a8eebd82SJames Collins $html .= '<input type="hidden" name="do" value="search">'; 1050a8eebd82SJames Collins $html .= '<input type="hidden" name="id" value="' . $ID . '">'; 1051c1cb9f15SChris MacMackin $html .= '<input name="q" '; 10529cff245bSJames Collins if ($this->getConf('searchUseTypeahead') === true) { 1053c1cb9f15SChris MacMackin $html .= 'class="search_typeahead" '; 1054c1cb9f15SChris MacMackin } 10559cff245bSJames Collins $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' . 10563a385f2cSJames Collins ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />'; 1057a8eebd82SJames Collins $html .= '<button type="submit" title="' . $lang['btn_search'] . '">'; 10583a385f2cSJames Collins if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) { 1059a8eebd82SJames Collins $html .= $this->mikioInlineIcon('search'); 1060ab45ba71SJames Collins } else { 1061ab45ba71SJames Collins $html .= $lang['btn_search']; 1062ab45ba71SJames Collins } 1063ab45ba71SJames Collins $html .= '</button>'; 1064ab45ba71SJames Collins $html .= '</form>'; 1065ab45ba71SJames Collins 10669cff245bSJames Collins if ($print === true) { 10679cff245bSJames Collins echo $html; 10689cff245bSJames Collins } 1069ab45ba71SJames Collins return $html; 1070ab45ba71SJames Collins } 1071ab45ba71SJames Collins 1072ab45ba71SJames Collins 1073a8eebd82SJames Collins /** 1074a8eebd82SJames Collins * Print or return content 1075a8eebd82SJames Collins * 10769cff245bSJames Collins * @param boolean $print Print content. 1077a8eebd82SJames Collins * @return string contents 1078a8eebd82SJames Collins */ 10799cff245bSJames Collins public function includeContent(bool $print = true) 108010b40067Snomadjimbob { 1081ab45ba71SJames Collins ob_start(); 10829cff245bSJames Collins tpl_content(false); 1083ab45ba71SJames Collins $html = ob_get_contents(); 1084ab45ba71SJames Collins ob_end_clean(); 1085ab45ba71SJames Collins 1086ab45ba71SJames Collins $html = $this->includeIcons($html); 1087ab45ba71SJames Collins $html = $this->parseContent($html); 1088ab45ba71SJames Collins 1089ab45ba71SJames Collins $html .= '<div style="clear:both"></div>'; 1090ab45ba71SJames Collins 10919cff245bSJames Collins if ($this->getConf('heroTitle') === false) { 10929cff245bSJames Collins $html = '<div class="mikio-tags"></div>' . $html; 10939cff245bSJames Collins } 1094a8eebd82SJames Collins 1095a8eebd82SJames Collins $html = '<div class="mikio-article-content">' . $html . '</div>'; 1096a8eebd82SJames Collins 10979cff245bSJames Collins if ($print === true) { 10989cff245bSJames Collins echo $html; 10999cff245bSJames Collins } 1100ab45ba71SJames Collins return $html; 1101ab45ba71SJames Collins } 1102ab45ba71SJames Collins 1103a8eebd82SJames Collins /** 1104ab45ba71SJames Collins * Print or return footer 1105ab45ba71SJames Collins * 11069cff245bSJames Collins * @param boolean $print Print footer. 11079cff245bSJames Collins * @return string HTML string containing footer 1108ab45ba71SJames Collins */ 11099cff245bSJames Collins public function includeFooter(bool $print = true) 111010b40067Snomadjimbob { 1111ab45ba71SJames Collins global $ACT; 1112ab45ba71SJames Collins 1113ab45ba71SJames Collins $html = ''; 1114ab45ba71SJames Collins 1115ab45ba71SJames Collins $html .= '<footer class="mikio-footer">'; 11169cff245bSJames Collins $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>'; 11179cff245bSJames Collins $html .= $this->includePage('footer', false); 1118ab45ba71SJames Collins 1119a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('footerCustomMenuText')); 1120ab45ba71SJames Collins 11219cff245bSJames Collins if ($this->getConf('footerSearch') === true) { 1122ab45ba71SJames Collins $html .= '<div class="mikio-footer-search">'; 11239cff245bSJames Collins $html .= $this->includeSearch(false); 1124ab45ba71SJames Collins $html .= '</div>'; 1125ab45ba71SJames Collins } 1126ab45ba71SJames Collins 1127a8eebd82SJames Collins $showPageTools = $this->getConf('pageToolsFooter'); 11289cff245bSJames Collins if ( 11293a385f2cSJames Collins strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 || 11303a385f2cSJames Collins $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0) 11319cff245bSJames Collins ) { 11329cff245bSJames Collins $html .= $this->includePageTools(false); 11339cff245bSJames Collins } 1134ab45ba71SJames Collins 11359cff245bSJames Collins $meta['licenseType'] = ['multichoice', '_choices' => ['none', 'badge', 'button']]; 11369cff245bSJames Collins $meta['licenseImageOnly'] = ['onoff']; 1137ab45ba71SJames Collins 1138ab45ba71SJames Collins $licenseType = $this->getConf('licenseType'); 11399cff245bSJames Collins if ($licenseType !== 'none') { 11409cff245bSJames Collins $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true); 1141ab45ba71SJames Collins } 1142ab45ba71SJames Collins 1143ab45ba71SJames Collins $html .= '</footer>'; 1144ab45ba71SJames Collins 11459cff245bSJames Collins if ($print === true) { 11469cff245bSJames Collins echo $html; 11479cff245bSJames Collins } 1148ab45ba71SJames Collins return $html; 1149ab45ba71SJames Collins } 1150ab45ba71SJames Collins 1151ab45ba71SJames Collins 1152a8eebd82SJames Collins /** 1153ab45ba71SJames Collins * Print or return breadcrumb trail 1154ab45ba71SJames Collins * 11559cff245bSJames Collins * @param boolean $print Print out trail. 11569cff245bSJames Collins * @param boolean $parse Parse trail before printing. 11579cff245bSJames Collins * @return string HTML string containing breadcrumbs 1158ab45ba71SJames Collins */ 11599cff245bSJames Collins public function includeBreadcrumbs(bool $print = true, bool $parse = true) 116010b40067Snomadjimbob { 1161a8eebd82SJames Collins global $conf, $ID, $lang, $ACT; 1162a8eebd82SJames Collins 11633a385f2cSJames Collins if ( 11643a385f2cSJames Collins $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 && 116595372bffSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0 11663a385f2cSJames Collins ) { 11679cff245bSJames Collins return ''; 11689cff245bSJames Collins } 1169ab45ba71SJames Collins 1170ab45ba71SJames Collins $html = '<div class="mikio-breadcrumbs">'; 1171f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 11723a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 117395372bffSJames Collins if ($conf['breadcrumbs'] !== 0) { 11749cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) { 1175ab45ba71SJames Collins ob_start(); 117675adba86SJames Collins tpl_breadcrumbs(); 1177ab45ba71SJames Collins $html .= ob_get_contents(); 1178ab45ba71SJames Collins ob_end_clean(); 1179ab45ba71SJames Collins } else { 1180ab45ba71SJames Collins $sep = '•'; 1181ab45ba71SJames Collins $prefix = $lang['breadcrumb']; 1182ab45ba71SJames Collins 11839cff245bSJames Collins if ($this->getConf('breadcrumbSep') === true) { 1184ab45ba71SJames Collins $sep = $this->getConf('breadcrumbSepText'); 11859cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-sep', false); 1186ab45ba71SJames Collins 11879cff245bSJames Collins if ($img !== false) { 1188ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1189ab45ba71SJames Collins } 119047161538SJames Collins } 119147161538SJames Collins 11929cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === true) { 1193ab45ba71SJames Collins $prefix = $this->getConf('breadcrumbPrefixText'); 11949cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-prefix', false); 1195ab45ba71SJames Collins 11969cff245bSJames Collins if ($img !== false) { 1197ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 1198ab45ba71SJames Collins } 1199ab45ba71SJames Collins } 1200ab45ba71SJames Collins 1201ab45ba71SJames Collins $crumbs = breadcrumbs(); 1202ab45ba71SJames Collins 1203ab45ba71SJames Collins $html .= '<ul>'; 12043a385f2cSJames Collins if (empty($prefix) === false) { 12059cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 12069cff245bSJames Collins } 1207ab45ba71SJames Collins 1208ab45ba71SJames Collins $last = count($crumbs); 1209ab45ba71SJames Collins $i = 0; 1210ab45ba71SJames Collins foreach ($crumbs as $id => $name) { 1211ab45ba71SJames Collins $i++; 121295372bffSJames Collins if ($i !== 1) { 1213ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 121495372bffSJames Collins } 12159cff245bSJames Collins $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>'; 12169cff245bSJames Collins $html .= tpl_pagelink($id, null, true); 1217ab45ba71SJames Collins $html .= '</li>'; 1218ab45ba71SJames Collins } 1219ab45ba71SJames Collins 1220ab45ba71SJames Collins $html .= '</ul>'; 12219cff245bSJames Collins }//end if 12229cff245bSJames Collins }//end if 12239cff245bSJames Collins }//end if 12243d11a778SJames Collins 12253d11a778SJames Collins $html .= '</div>'; 12263d11a778SJames Collins $html .= '</div>'; 12273d11a778SJames Collins 12289cff245bSJames Collins if ($parse === true) { 12299cff245bSJames Collins $html = $this->includeIcons($html); 12309cff245bSJames Collins } 12319cff245bSJames Collins if ($print === true) { 12329cff245bSJames Collins echo $html; 12339cff245bSJames Collins } 12343d11a778SJames Collins return $html; 12353d11a778SJames Collins } 12363d11a778SJames Collins 12373d11a778SJames Collins /** 12383d11a778SJames Collins * Print or return you are here trail 12393d11a778SJames Collins * 12409cff245bSJames Collins * @param boolean $print Print out trail. 12419cff245bSJames Collins * @param boolean $parse Parse trail before printing. 12429cff245bSJames Collins * @return string HTML string containing breadcrumbs 12433d11a778SJames Collins */ 12449cff245bSJames Collins public function includeYouAreHere(bool $print = true, bool $parse = true) 12453d11a778SJames Collins { 12463d11a778SJames Collins global $conf, $ID, $lang, $ACT; 12473d11a778SJames Collins 12483a385f2cSJames Collins if ( 12493a385f2cSJames Collins $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 && 125095372bffSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0 12513a385f2cSJames Collins ) { 12529cff245bSJames Collins return ''; 12539cff245bSJames Collins } 12543d11a778SJames Collins 12553d11a778SJames Collins $html = '<div class="mikio-youarehere">'; 12563d11a778SJames Collins $html .= '<div class="mikio-container">'; 12573a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 125895372bffSJames Collins if ($conf['youarehere'] !== 0) { 12599cff245bSJames Collins if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) { 126095372bffSJames Collins $html .= '<div class="mikio-bcdw">'; 1261ab45ba71SJames Collins ob_start(); 126275adba86SJames Collins tpl_youarehere(); 1263ab45ba71SJames Collins $html .= ob_get_contents(); 1264ab45ba71SJames Collins ob_end_clean(); 126595372bffSJames Collins $html .= '</div>'; 1266ab45ba71SJames Collins } else { 1267ab45ba71SJames Collins $sep = ' » '; 1268ab45ba71SJames Collins $prefix = $lang['youarehere']; 1269ab45ba71SJames Collins 12709cff245bSJames Collins if ($this->getConf('youarehereSep') === true) { 12713d11a778SJames Collins $sep = $this->getConf('youarehereSepText'); 12729cff245bSJames Collins $img = $this->getMediaFile('youarehere-sep', false); 1273ab45ba71SJames Collins 12749cff245bSJames Collins if ($img !== false) { 1275ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1276ab45ba71SJames Collins } 127775adba86SJames Collins } 127875adba86SJames Collins 12799cff245bSJames Collins if ($this->getConf('youareherePrefix') === true) { 12803d11a778SJames Collins $prefix = $this->getConf('youareherePrefixText'); 12819cff245bSJames Collins $img = $this->getMediaFile('youarehere-prefix', false); 1282ab45ba71SJames Collins 12839cff245bSJames Collins if ($img !== false) { 1284ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 128575adba86SJames Collins } 128647161538SJames Collins } 128747161538SJames Collins 1288ab45ba71SJames Collins $html .= '<ul>'; 12893a385f2cSJames Collins if (empty($prefix) === false) { 12909cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 12919cff245bSJames Collins } 12929cff245bSJames Collins $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>'; 1293ab45ba71SJames Collins 1294ab45ba71SJames Collins $parts = explode(':', $ID); 1295ab45ba71SJames Collins $count = count($parts); 1296ab45ba71SJames Collins 1297ab45ba71SJames Collins $part = ''; 12989cff245bSJames Collins for ($i = 0; $i < ($count - 1); $i++) { 1299ab45ba71SJames Collins $part .= $parts[$i] . ':'; 1300ab45ba71SJames Collins $page = $part; 13019cff245bSJames Collins if ($page === $conf['start']) { 13029cff245bSJames Collins continue; 13039cff245bSJames Collins } 1304ab45ba71SJames Collins 1305ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 13069cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1307ab45ba71SJames Collins } 1308ab45ba71SJames Collins 1309ab45ba71SJames Collins resolve_pageid('', $page, $exists); 13109cff245bSJames Collins if ((isset($page) === true && $page === $part . $parts[$i]) === false) { 1311ab45ba71SJames Collins $page = $part . $parts[$i]; 13129cff245bSJames Collins if ($page !== $conf['start']) { 1313ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 13149cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1315ab45ba71SJames Collins } 1316ab45ba71SJames Collins } 1317ab45ba71SJames Collins 1318ab45ba71SJames Collins $html .= '</ul>'; 13199cff245bSJames Collins }//end if 13209cff245bSJames Collins }//end if 1321ab45ba71SJames Collins 13223d11a778SJames Collins $showLast = $this->getConf('youarehereShowLast'); 13239cff245bSJames Collins if ($showLast !== 0) { 1324a8eebd82SJames Collins preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches); 13259cff245bSJames Collins if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) { 1326a8eebd82SJames Collins $count = count($matches[0]); 1327a8eebd82SJames Collins $list = ''; 1328a8eebd82SJames Collins 1329a8eebd82SJames Collins // Show Home 1330a8eebd82SJames Collins $list .= $matches[0][0] . $matches[0][1]; 1331a8eebd82SJames Collins 1332a8eebd82SJames Collins $list .= '<li>...</li>'; 13339cff245bSJames Collins for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) { 1334a8eebd82SJames Collins $list .= $matches[0][$i]; 1335a8eebd82SJames Collins } 1336a8eebd82SJames Collins 1337a8eebd82SJames Collins $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html); 1338a8eebd82SJames Collins } 1339a8eebd82SJames Collins } 1340a8eebd82SJames Collins 13413d11a778SJames Collins switch ($this->getConf('youarehereHome')) { 1342a8eebd82SJames Collins case 'none': 1343a8eebd82SJames Collins $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2); 1344a8eebd82SJames Collins break; 1345a8eebd82SJames Collins case 'home': 1346a8eebd82SJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1); 1347a8eebd82SJames Collins break; 1348a8eebd82SJames Collins case 'icon': 13499cff245bSJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . 13509cff245bSJames Collins $this->mikioInlineIcon('home') . '$3', $html, 1); 1351a8eebd82SJames Collins break; 1352a8eebd82SJames Collins } 1353a8eebd82SJames Collins } else { 1354a8eebd82SJames Collins $html .= '≪ '; 13559cff245bSJames Collins if (isset($_GET['page']) === true) { 13569cff245bSJames Collins $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a> / '; 1357a8eebd82SJames Collins } 13584057121fSJames Collins $html .= '<a href="' . wl($ID) . '">View Page</a>'; 13599cff245bSJames Collins }//end if 13609cff245bSJames Collins 13619cff245bSJames Collins $html .= '</div>'; 13629cff245bSJames Collins $html .= '</div>'; 13639cff245bSJames Collins 13649cff245bSJames Collins if ($parse === true) { 13659cff245bSJames Collins $html = $this->includeIcons($html); 1366a8eebd82SJames Collins } 13679cff245bSJames Collins if ($print === true) { 13689cff245bSJames Collins echo $html; 13699cff245bSJames Collins } 1370ab45ba71SJames Collins return $html; 1371ab45ba71SJames Collins } 1372ab45ba71SJames Collins 13731785fc73SJames Collins /** 13741785fc73SJames Collins * Get Page Title 13759cff245bSJames Collins * 13769cff245bSJames Collins * @return string page title 13771785fc73SJames Collins */ 137810b40067Snomadjimbob public function parsePageTitle() 137910b40067Snomadjimbob { 13802060e56cSJames Collins global $ID; 13812060e56cSJames Collins 13822060e56cSJames Collins $title = p_get_first_heading($ID); 13839cff245bSJames Collins if (strlen($title) <= 0) { 13849cff245bSJames Collins $title = tpl_pagetitle(null, true); 13859cff245bSJames Collins } 13861785fc73SJames Collins $title = $this->includeIcons($title); 13871785fc73SJames Collins 13881785fc73SJames Collins return $title; 13891785fc73SJames Collins } 13901785fc73SJames Collins 1391ab45ba71SJames Collins 139275adba86SJames Collins /** 1393a8eebd82SJames Collins * Print or return hero block 139475adba86SJames Collins * 13959cff245bSJames Collins * @param boolean $print Print content. 1396a8eebd82SJames Collins * @return string contents of hero 139775adba86SJames Collins */ 13989cff245bSJames Collins public function includeHero(bool $print = true) 139910b40067Snomadjimbob { 1400a8eebd82SJames Collins $html = ''; 140147161538SJames Collins 14029cff245bSJames Collins if ($this->getConf('heroTitle') === true) { 1403a8eebd82SJames Collins $html .= '<div class="mikio-hero">'; 1404f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 1405a8eebd82SJames Collins $html .= '<div class="mikio-hero-text">'; 14063a385f2cSJames Collins if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) { 14079cff245bSJames Collins $html .= $this->includeYouAreHere(false); 14089cff245bSJames Collins } 14093a385f2cSJames Collins if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) { 14109cff245bSJames Collins $html .= $this->includeBreadcrumbs(false); 14119cff245bSJames Collins } 1412ab45ba71SJames Collins 1413a8eebd82SJames Collins $html .= '<h1 class="mikio-hero-title">'; 14141785fc73SJames Collins $html .= $this->parsePageTitle(); // No idea why this requires a blank space afterwards to work? 1415a8eebd82SJames Collins $html .= '</h1>'; 1416a8eebd82SJames Collins $html .= '<h2 class="mikio-hero-subtitle"></h2>'; 1417a8eebd82SJames Collins $html .= '</div>'; 141847161538SJames Collins 14199cff245bSJames Collins $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true)); 1420a8eebd82SJames Collins $hero_image_resize_class = ''; 14213a385f2cSJames Collins if (empty($hero_image) === false) { 1422a8eebd82SJames Collins $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"'; 1423a8eebd82SJames Collins $hero_image_resize_class = ' mikio-hero-image-resize'; 142447161538SJames Collins } 1425a8eebd82SJames Collins 14269cff245bSJames Collins $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image . 14279cff245bSJames Collins '><div class="mikio-tags"></div></div>'; 1428a8eebd82SJames Collins 1429a8eebd82SJames Collins $html .= '</div>'; 1430f8039bf2SJames Collins $html .= '</div>'; 14319cff245bSJames Collins }//end if 14329cff245bSJames Collins 14339cff245bSJames Collins if ($print === true) { 14349cff245bSJames Collins echo $html; 143575adba86SJames Collins } 1436a8eebd82SJames Collins 1437a8eebd82SJames Collins return $html; 143875adba86SJames Collins } 143975adba86SJames Collins 144075adba86SJames Collins 144175adba86SJames Collins /** 1442a8eebd82SJames Collins * Print or return out TOC 144375adba86SJames Collins * 14449cff245bSJames Collins * @param boolean $print Print TOC. 14459cff245bSJames Collins * @param boolean $parse Parse icons. 1446a8eebd82SJames Collins * @return string contents of TOC 144775adba86SJames Collins */ 14489cff245bSJames Collins public function includeTOC(bool $print = true, bool $parse = true) 144910b40067Snomadjimbob { 1450ab45ba71SJames Collins $html = ''; 14512b4583abSJames Collins 1452ab45ba71SJames Collins $tocHtml = tpl_toc(true); 1453ab45ba71SJames Collins 14543a385f2cSJames Collins if (empty($tocHtml) === false) { 1455ab45ba71SJames Collins $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml); 1456a8eebd82SJames Collins $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml); 1457ab45ba71SJames Collins 1458ab45ba71SJames Collins $html .= '<div class="mikio-toc">'; 1459ab45ba71SJames Collins $html .= $tocHtml; 1460ab45ba71SJames Collins $html .= '</div>'; 14612b4583abSJames Collins } 14622b4583abSJames Collins 14639cff245bSJames Collins if ($parse === true) { 14649cff245bSJames Collins $html = $this->includeIcons($html); 14659cff245bSJames Collins } 14669cff245bSJames Collins 14679cff245bSJames Collins if ($print === true) { 1468ab45ba71SJames Collins echo $html; 1469ab45ba71SJames Collins } 1470ab45ba71SJames Collins 14719cff245bSJames Collins return $html; 14729cff245bSJames Collins } 14739cff245bSJames Collins 1474ab45ba71SJames Collins 1475a8eebd82SJames Collins /** 1476ab45ba71SJames Collins * Parse the string and replace icon elements with included icon libraries 1477ab45ba71SJames Collins * 14789cff245bSJames Collins * @param string $str Content to parse. 1479ab45ba71SJames Collins * @return string parsed string 1480ab45ba71SJames Collins */ 14819cff245bSJames Collins public function includeIcons(string $str) 148210b40067Snomadjimbob { 1483ab45ba71SJames Collins global $ACT, $MIKIO_ICONS; 1484ab45ba71SJames Collins 1485ab45ba71SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 14863a385f2cSJames Collins if (empty($iconTag) === true) { 14879cff245bSJames Collins return $str; 14889cff245bSJames Collins } 1489ab45ba71SJames Collins 14909cff245bSJames Collins if ( 14919cff245bSJames Collins in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true || 14923a385f2cSJames Collins strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0 14939cff245bSJames Collins ) { 1494a2005a27SJames Collins $content = $str; 1495a2005a27SJames Collins $preview = null; 1496a2005a27SJames Collins 14973a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 14989cff245bSJames Collins $html = new \simple_html_dom(); 1499a2005a27SJames Collins $html->stripRNAttrValues = false; 1500a2005a27SJames Collins $html->load($str, true, false); 1501a2005a27SJames Collins 1502a2005a27SJames Collins $preview = $html->find('div.preview'); 15039cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1504a2005a27SJames Collins $content = $preview[0]->innertext; 1505a2005a27SJames Collins } 1506a2005a27SJames Collins } 1507a2005a27SJames Collins 15081785fc73SJames Collins $page_regex = '/(.*)/'; 15099cff245bSJames Collins if (stripos($str, '<pre') !== false) { 15101785fc73SJames Collins $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/'; 15111785fc73SJames Collins } 15121785fc73SJames Collins 15131785fc73SJames Collins $content = preg_replace_callback($page_regex, function ($icons) { 1514a2005a27SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 1515a2005a27SJames Collins 151610b40067Snomadjimbob return preg_replace_callback( 151710b40067Snomadjimbob '/<' . $iconTag . ' ([\w\- #]*)>(?=[^>]*(<|$))/', 1518ab45ba71SJames Collins function ($matches) { 1519ab45ba71SJames Collins global $MIKIO_ICONS; 1520ab45ba71SJames Collins 1521ab45ba71SJames Collins $s = $matches[0]; 1522ab45ba71SJames Collins 1523ab45ba71SJames Collins if (count($MIKIO_ICONS) > 0) { 1524ab45ba71SJames Collins $icon = $MIKIO_ICONS[0]; 1525ab45ba71SJames Collins 1526ab45ba71SJames Collins if (count($matches) > 1) { 1527ab45ba71SJames Collins $e = explode(' ', $matches[1]); 1528ab45ba71SJames Collins 1529ab45ba71SJames Collins if (count($e) > 1) { 1530ab45ba71SJames Collins foreach ($MIKIO_ICONS as $iconItem) { 15319cff245bSJames Collins if (strcasecmp($iconItem['name'], $e[0]) === 0) { 1532ab45ba71SJames Collins $icon = $iconItem; 1533ab45ba71SJames Collins 1534ab45ba71SJames Collins $s = $icon['insert']; 1535ab45ba71SJames Collins for ($i = 1; $i < 9; $i++) { 15363a385f2cSJames Collins if (count(empty($e) < $i || $e[$i]) === true) { 15379cff245bSJames Collins if (isset($icon['$' . $i]) === true) { 1538ab45ba71SJames Collins $s = str_replace('$' . $i, $icon['$' . $i], $s); 1539ab45ba71SJames Collins } 1540ab45ba71SJames Collins } else { 1541ab45ba71SJames Collins $s = str_replace('$' . $i, $e[$i], $s); 1542ab45ba71SJames Collins } 1543ab45ba71SJames Collins } 1544ab45ba71SJames Collins 1545ab45ba71SJames Collins $dir = ''; 15469cff245bSJames Collins if (isset($icon['dir']) === true) { 15479cff245bSJames Collins $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/'; 15489cff245bSJames Collins } 1549ab45ba71SJames Collins 1550ab45ba71SJames Collins $s = str_replace('$0', $dir, $s); 1551ab45ba71SJames Collins 1552ab45ba71SJames Collins break; 15539cff245bSJames Collins }//end if 15549cff245bSJames Collins }//end foreach 1555ab45ba71SJames Collins } else { 1556ab45ba71SJames Collins $s = str_replace('$1', $matches[1], $icon['insert']); 15579cff245bSJames Collins }//end if 15589cff245bSJames Collins }//end if 15599cff245bSJames Collins }//end if 156075adba86SJames Collins 1561ab45ba71SJames Collins $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count); 15629cff245bSJames Collins if ($count === 0) { 1563ab45ba71SJames Collins $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s); 1564ab45ba71SJames Collins } 1565ab45ba71SJames Collins 1566ab45ba71SJames Collins return $s; 1567ab45ba71SJames Collins }, 156810b40067Snomadjimbob $icons[0] 156910b40067Snomadjimbob ); 1570a2005a27SJames Collins }, $content); 1571a2005a27SJames Collins 15723a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 15739cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1574a2005a27SJames Collins $preview[0]->innertext = $content; 1575a2005a27SJames Collins } 1576a2005a27SJames Collins 1577a2005a27SJames Collins $str = $html->save(); 1578a2005a27SJames Collins $html->clear(); 1579a2005a27SJames Collins unset($html); 1580a2005a27SJames Collins } else { 1581a2005a27SJames Collins $str = $content; 1582a2005a27SJames Collins } 15839cff245bSJames Collins }//end if 1584ab45ba71SJames Collins 1585ab45ba71SJames Collins return $str; 1586ab45ba71SJames Collins } 158747161538SJames Collins 1588c165b184SJames Collins /** 1589a8eebd82SJames Collins * Parse HTML for theme 1590c165b184SJames Collins * 15919cff245bSJames Collins * @param string $content HTML content to parse. 1592a8eebd82SJames Collins * @return string Parsed content 1593c165b184SJames Collins */ 15949cff245bSJames Collins public function parseContent(string $content) 159510b40067Snomadjimbob { 1596ab45ba71SJames Collins global $INPUT, $ACT; 1597ab45ba71SJames Collins 1598a8eebd82SJames Collins // Add Mikio Section titles 15993a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 16009cff245bSJames Collins $admin_sections = [ 1601ab45ba71SJames Collins // Section Insert Before Icon 16029cff245bSJames Collins 'navbar' => ['navbarUseTitleIcon', ''], 16039cff245bSJames Collins 'search' => ['searchButton', ''], 16049cff245bSJames Collins 'hero' => ['heroTitle', ''], 16059cff245bSJames Collins 'tags' => ['tagsConsolidate', ''], 16069cff245bSJames Collins 'breadcrumb' => ['breadcrumbHideHome', ''], 16079cff245bSJames Collins 'youarehere' => ['youarehereHideHome', ''], 16089cff245bSJames Collins 'sidebar' => ['sidebarShowLeft', ''], 16099cff245bSJames Collins 'toc' => ['tocFull', ''], 16109cff245bSJames Collins 'pagetools' => ['pageToolsFloating', ''], 16119cff245bSJames Collins 'footer' => ['footerCustomMenuText', ''], 16129cff245bSJames Collins 'license' => ['licenseType', ''], 16139cff245bSJames Collins 'acl' => ['includePageUseACL', ''], 16149cff245bSJames Collins 'sticky' => ['stickyTopHeader', ''], 16159cff245bSJames Collins ]; 1616ab45ba71SJames Collins 1617ab45ba71SJames Collins foreach ($admin_sections as $section => $items) { 1618ab45ba71SJames Collins $search = $items[0]; 1619ab45ba71SJames Collins $icon = $items[1]; 1620ab45ba71SJames Collins 162110b40067Snomadjimbob $content = preg_replace( 1622adf52ebbSJames Collins '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/', 16239cff245bSJames Collins '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) . 16249cff245bSJames Collins tpl_getLang('config_' . $section) . 16259cff245bSJames Collins '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' . 16269cff245bSJames Collins $search . '</span>', 162710b40067Snomadjimbob $content 162810b40067Snomadjimbob ); 1629ab45ba71SJames Collins } 16309cff245bSJames Collins }//end if 1631ab45ba71SJames Collins 16323a385f2cSJames Collins if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) { 1633a8eebd82SJames Collins $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content); 1634a8eebd82SJames Collins } 1635ab45ba71SJames Collins 1636a8eebd82SJames Collins // Page Revisions - Table Fix 16379cff245bSJames Collins if (strpos($content, 'id="page__revisions"') !== false) { 16389cff245bSJames Collins $content = preg_replace( 16399cff245bSJames Collins '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/', 16409cff245bSJames Collins '<span>$1</span>', 16419cff245bSJames Collins $content 16429cff245bSJames Collins ); 1643a8eebd82SJames Collins } 1644ab45ba71SJames Collins 16459cff245bSJames Collins $html = new \simple_html_dom(); 1646bc1032d9SJames Collins $html->stripRNAttrValues = false; 1647c165b184SJames Collins $html->load($content, true, false); 1648c165b184SJames Collins 16499cff245bSJames Collins if ($html === false) { 16509cff245bSJames Collins return $content; 16519cff245bSJames Collins } 1652ab45ba71SJames Collins 1653ab45ba71SJames Collins /* Buttons */ 1654ab45ba71SJames Collins foreach ($html->find('#config__manager button') as $node) { 1655ab45ba71SJames Collins $c = explode(' ', $node->class); 16569cff245bSJames Collins if (in_array('mikio-button', $c) === false) { 16579cff245bSJames Collins $c[] = 'mikio-button'; 16589cff245bSJames Collins } 1659ab45ba71SJames Collins $node->class = implode(' ', $c); 1660c165b184SJames Collins } 1661c165b184SJames Collins 1662ab45ba71SJames Collins 1663ab45ba71SJames Collins /* Buttons - Primary */ 1664ab45ba71SJames Collins foreach ($html->find('#config__manager [type=submit]') as $node) { 1665ab45ba71SJames Collins $c = explode(' ', $node->class); 16669cff245bSJames Collins if (in_array('mikio-primary', $c) === false) { 16679cff245bSJames Collins $c[] = 'mikio-primary'; 16689cff245bSJames Collins } 1669ab45ba71SJames Collins $node->class = implode(' ', $c); 1670ab45ba71SJames Collins } 1671ab45ba71SJames Collins 1672a8eebd82SJames Collins /* Hide page title if hero is enabled */ 16739cff245bSJames Collins if ($this->getConf('heroTitle') === true && $ACT !== 'preview') { 16741785fc73SJames Collins $pageTitle = $this->parsePageTitle(); 167547161538SJames Collins 167647161538SJames Collins foreach ($html->find('h1,h2,h3,h4') as $elm) { 16779cff245bSJames Collins if ($elm->innertext === $pageTitle) { 1678a8eebd82SJames Collins // $elm->innertext = ''; 1679a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1680a8eebd82SJames Collins 168147161538SJames Collins break; 168247161538SJames Collins } 168347161538SJames Collins } 168447161538SJames Collins } 1685c165b184SJames Collins 1686a8eebd82SJames Collins /* Hero subtitle */ 16872b4583abSJames Collins foreach ($html->find('p') as $elm) { 16882b4583abSJames Collins $i = stripos($elm->innertext, '~~hero-subtitle'); 16892b4583abSJames Collins if ($i !== false) { 16909cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 16912b4583abSJames Collins if ($j !== false) { 16929cff245bSJames Collins if ($j > ($i + 16)) { 16939cff245bSJames Collins $subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16)); 1694a8eebd82SJames Collins $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')'; 1695a8eebd82SJames Collins 1696a8eebd82SJames Collins // $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2); 1697a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext); 16982b4583abSJames Collins } 16992b4583abSJames Collins 17002b4583abSJames Collins break; 17012b4583abSJames Collins } 17022b4583abSJames Collins } 17032b4583abSJames Collins } 17042b4583abSJames Collins 1705a8eebd82SJames Collins /* Hero image */ 1706a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1707a8eebd82SJames Collins $image = ''; 1708a8eebd82SJames Collins preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches); 1709a8eebd82SJames Collins if (count($matches) > 0) { 1710a8eebd82SJames Collins preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches); 1711a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1712a8eebd82SJames Collins $image = $imageTagMatches[1]; 1713a8eebd82SJames Collins } else { 1714a8eebd82SJames Collins preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches); 1715a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1716a8eebd82SJames Collins $image = $imageTagMatches[1]; 1717a8eebd82SJames Collins } else { 1718a8eebd82SJames Collins $image = strip_tags($matches[1]); 17199cff245bSJames Collins if (stripos($image, ':') === false) { 17209cff245bSJames Collins $image = str_replace(['{', '}'], '', $image); 1721a8eebd82SJames Collins $i = stripos($image, '?'); 17229cff245bSJames Collins if ($i !== false) { 1723a8eebd82SJames Collins $image = substr($image, 0, $i); 1724c165b184SJames Collins } 1725c165b184SJames Collins 1726a8eebd82SJames Collins $image = ml($image, '', true, '', false); 1727ab45ba71SJames Collins } 1728ab45ba71SJames Collins } 1729ab45ba71SJames Collins } 1730ab45ba71SJames Collins 1731a8eebd82SJames Collins $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')'; 1732a8eebd82SJames Collins 1733a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext); 17349cff245bSJames Collins }//end if 17359cff245bSJames Collins }//end foreach 1736ab45ba71SJames Collins 17379cff245bSJames Collins /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color] 17389cff245bSJames Collins [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */ 1739a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1740a8eebd82SJames Collins $i = stripos($elm->innertext, '~~hero-colors'); 1741a8eebd82SJames Collins if ($i !== false) { 17429cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 1743a8eebd82SJames Collins if ($j !== false) { 17449cff245bSJames Collins if ($j > ($i + 14)) { 17459cff245bSJames Collins $color = substr($elm->innertext, ($i + 14), ($j - $i - 14)); 1746a8eebd82SJames Collins $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')'; 1747ab45ba71SJames Collins 1748a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext); 1749ab45ba71SJames Collins } 1750ab45ba71SJames Collins 1751a8eebd82SJames Collins break; 1752ab45ba71SJames Collins } 1753ab45ba71SJames Collins } 1754ab45ba71SJames Collins } 1755ab45ba71SJames Collins 175696ec8e1eSJames Collins /* Hide parts - ~~hide-parts [parts]~~ */ 175796ec8e1eSJames Collins foreach ($html->find('p') as $elm) { 175896ec8e1eSJames Collins $i = stripos($elm->innertext, '~~hide-parts'); 175996ec8e1eSJames Collins if ($i !== false) { 17609cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 176196ec8e1eSJames Collins if ($j !== false) { 17629cff245bSJames Collins if ($j > ($i + 13)) { 17639cff245bSJames Collins $parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13))); 176496ec8e1eSJames Collins $script = ''; 176596ec8e1eSJames Collins 176696ec8e1eSJames Collins foreach ($parts as $part) { 176796ec8e1eSJames Collins // $part = trim($part); 176896ec8e1eSJames Collins if (strlen($part) > 0) { 176996ec8e1eSJames Collins $script .= 'mikio.hidePart(\'' . $part . '\');'; 177096ec8e1eSJames Collins } 177196ec8e1eSJames Collins } 177296ec8e1eSJames Collins 177396ec8e1eSJames Collins if (strlen($script) > 0) { 177496ec8e1eSJames Collins $this->footerScript['hide-parts'] = $script; 177596ec8e1eSJames Collins } 177696ec8e1eSJames Collins 177796ec8e1eSJames Collins $elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext); 177896ec8e1eSJames Collins } 177996ec8e1eSJames Collins 178096ec8e1eSJames Collins break; 17819cff245bSJames Collins }//end if 17829cff245bSJames Collins }//end if 17839cff245bSJames Collins }//end foreach 178496ec8e1eSJames Collins 178596ec8e1eSJames Collins 1786a8eebd82SJames Collins /* Page Tags (tag plugin) */ 17879cff245bSJames Collins if ($this->getConf('tagsConsolidate') === true) { 1788a8eebd82SJames Collins $tags = ''; 1789a8eebd82SJames Collins foreach ($html->find('div.tags a') as $elm) { 1790a8eebd82SJames Collins $tags .= $elm->outertext; 1791a8eebd82SJames Collins } 1792a8eebd82SJames Collins 1793a8eebd82SJames Collins foreach ($html->find('div.tags') as $elm) { 1794a8eebd82SJames Collins $elm->innertext = ''; 1795a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1796a8eebd82SJames Collins } 1797a8eebd82SJames Collins 17983a385f2cSJames Collins if (empty($tags) === false) { 1799a8eebd82SJames Collins $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')'; 1800a8eebd82SJames Collins } 1801ab45ba71SJames Collins } 1802ab45ba71SJames Collins 1803ab45ba71SJames Collins // Configuration Manager 18043a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 1805ab45ba71SJames Collins // Additional save buttons 1806ab45ba71SJames Collins foreach ($html->find('#config__manager') as $cm) { 1807ab45ba71SJames Collins $saveButtons = ''; 1808ab45ba71SJames Collins 1809ab45ba71SJames Collins foreach ($cm->find('p') as $elm) { 1810ab45ba71SJames Collins $saveButtons = $elm->outertext; 1811a8eebd82SJames Collins $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons); 1812ab45ba71SJames Collins $elm->outertext = ''; 1813ab45ba71SJames Collins } 1814ab45ba71SJames Collins 1815ab45ba71SJames Collins foreach ($cm->find('fieldset') as $elm) { 1816ab45ba71SJames Collins $elm->innertext .= $saveButtons; 1817ab45ba71SJames Collins } 1818ab45ba71SJames Collins } 1819ab45ba71SJames Collins } 1820ab45ba71SJames Collins 1821ab45ba71SJames Collins $content = $html->save(); 1822c165b184SJames Collins $html->clear(); 1823c165b184SJames Collins unset($html); 1824c165b184SJames Collins 1825c165b184SJames Collins return $content; 1826c165b184SJames Collins } 18272b4583abSJames Collins 18282b4583abSJames Collins 1829a8eebd82SJames Collins /** 1830a8eebd82SJames Collins * Get DokuWiki namespace/page/URI as link 1831a8eebd82SJames Collins * 18329cff245bSJames Collins * @param string $str String to parse. 18339cff245bSJames Collins * @return string parsed URI 1834a8eebd82SJames Collins */ 18359cff245bSJames Collins public function getLink(string $str) 183610b40067Snomadjimbob { 18372b4583abSJames Collins $i = strpos($str, '://'); 18389cff245bSJames Collins if ($i !== false) { 18399cff245bSJames Collins return $str; 18409cff245bSJames Collins } 18412b4583abSJames Collins 18422b4583abSJames Collins return wl($str); 18432b4583abSJames Collins } 1844ab45ba71SJames Collins 1845ab45ba71SJames Collins 1846a8eebd82SJames Collins /** 1847a8eebd82SJames Collins * Check if the user can edit current namespace/page 1848a8eebd82SJames Collins * 1849a8eebd82SJames Collins * @return boolean user can edit 1850a8eebd82SJames Collins */ 185110b40067Snomadjimbob public function userCanEdit() 185210b40067Snomadjimbob { 1853ab45ba71SJames Collins global $INFO; 1854ab45ba71SJames Collins global $ID; 1855ab45ba71SJames Collins 1856ab45ba71SJames Collins $wiki_file = wikiFN($ID); 18579cff245bSJames Collins if (@file_exists($wiki_file) === false) { 18589cff245bSJames Collins return true; 18599cff245bSJames Collins } 18609cff245bSJames Collins if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) { 18619cff245bSJames Collins return true; 18629cff245bSJames Collins } 1863a8eebd82SJames Collins // $meta_file = metaFN($ID, '.meta'); 18649cff245bSJames Collins if ($INFO['meta']['user'] === false) { 18659cff245bSJames Collins return true; 18669cff245bSJames Collins } 18679cff245bSJames Collins if ($INFO['client'] === $INFO['meta']['user']) { 18689cff245bSJames Collins return true; 18699cff245bSJames Collins } 1870ab45ba71SJames Collins 1871ab45ba71SJames Collins return false; 1872c165b184SJames Collins } 187347161538SJames Collins 187447161538SJames Collins 1875a8eebd82SJames Collins /** 1876a8eebd82SJames Collins * Search for and return the uri of a media file 1877a8eebd82SJames Collins * 18789cff245bSJames Collins * @param string $image Image name to search for (without extension). 18799cff245bSJames Collins * @param boolean $searchCurrentNS Search the current namespace. 18809cff245bSJames Collins * @param boolean $propagate Propagate search through the namespace. 18819cff245bSJames Collins * @return string URI of the found media file 1882a8eebd82SJames Collins */ 18839cff245bSJames Collins public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true) 188410b40067Snomadjimbob { 1885ab45ba71SJames Collins global $INFO; 1886a8eebd82SJames Collins 18879cff245bSJames Collins $ext = ['png', 'jpg', 'gif', 'svg']; 1888ab45ba71SJames Collins 18899cff245bSJames Collins if ($searchCurrentNS === true) { 18909cff245bSJames Collins $prefix[] = ':' . $INFO['namespace'] . ':'; 18919cff245bSJames Collins } 18929cff245bSJames Collins if ($propagate === true) { 1893ab45ba71SJames Collins $prefix[] = ':'; 1894ab45ba71SJames Collins $prefix[] = ':wiki:'; 1895a8eebd82SJames Collins } 1896ab45ba71SJames Collins $theme = $this->getConf('customTheme'); 18973a385f2cSJames Collins if (empty($theme) === false) { 18989cff245bSJames Collins $prefix[] = 'themes/' . $theme . '/images/'; 18999cff245bSJames Collins } 1900ab45ba71SJames Collins $prefix[] = 'images/'; 1901ab45ba71SJames Collins 19029cff245bSJames Collins $search = []; 1903ab45ba71SJames Collins foreach ($prefix as $pitem) { 1904ab45ba71SJames Collins foreach ($ext as $eitem) { 1905ab45ba71SJames Collins $search[] = $pitem . $image . '.' . $eitem; 1906ab45ba71SJames Collins } 1907ab45ba71SJames Collins } 1908ab45ba71SJames Collins 1909ab45ba71SJames Collins $img = ''; 1910ab45ba71SJames Collins $file = ''; 1911ab45ba71SJames Collins $url = ''; 1912ab45ba71SJames Collins $ismedia = false; 1913ab45ba71SJames Collins $found = false; 1914ab45ba71SJames Collins 1915ab45ba71SJames Collins foreach ($search as $img) { 19163a385f2cSJames Collins if (strcasecmp(substr($img, 0, 1), ':') === 0) { 1917ab45ba71SJames Collins $file = mediaFN($img); 1918ab45ba71SJames Collins $ismedia = true; 1919ab45ba71SJames Collins } else { 1920ab45ba71SJames Collins $file = tpl_incdir() . $img; 1921ab45ba71SJames Collins $ismedia = false; 1922ab45ba71SJames Collins } 1923ab45ba71SJames Collins 19249cff245bSJames Collins if (file_exists($file) === true) { 1925ab45ba71SJames Collins $found = true; 1926ab45ba71SJames Collins break; 1927ab45ba71SJames Collins } 1928ab45ba71SJames Collins } 1929ab45ba71SJames Collins 19309cff245bSJames Collins if ($found === false) { 19319cff245bSJames Collins return false; 19329cff245bSJames Collins } 1933ab45ba71SJames Collins 19349cff245bSJames Collins if ($ismedia === true) { 1935ab45ba71SJames Collins $url = ml($img, '', true, '', false); 1936ab45ba71SJames Collins } else { 1937ab45ba71SJames Collins $url = tpl_basedir() . $img; 1938ab45ba71SJames Collins } 1939ab45ba71SJames Collins 1940ab45ba71SJames Collins return $url; 1941ab45ba71SJames Collins } 1942ab45ba71SJames Collins 1943a8eebd82SJames Collins 1944a8eebd82SJames Collins /** 1945ab45ba71SJames Collins * Print or return the page title 1946ab45ba71SJames Collins * 19479cff245bSJames Collins * @param string $page Page id or empty string for current page. 1948ab45ba71SJames Collins * @return string generated content 1949ab45ba71SJames Collins */ 19509cff245bSJames Collins public function getPageTitle(string $page = '') 195110b40067Snomadjimbob { 1952ab45ba71SJames Collins global $ID, $conf; 1953ab45ba71SJames Collins 1954ab45ba71SJames Collins $html = ''; 1955ab45ba71SJames Collins 19563a385f2cSJames Collins if (empty($page) === true) { 19579cff245bSJames Collins $page = $ID; 19589cff245bSJames Collins } 1959ab45ba71SJames Collins 1960ab45ba71SJames Collins $html = p_get_first_heading($page); 1961ab45ba71SJames Collins $html = strip_tags($html); 1962ab45ba71SJames Collins $html = preg_replace('/\s+/', ' ', $html); 1963ab45ba71SJames Collins $html .= ' [' . strip_tags($conf['title']) . ']'; 1964ab45ba71SJames Collins $html = trim($html); 1965ab45ba71SJames Collins 1966ab45ba71SJames Collins return $html; 1967ab45ba71SJames Collins } 1968a8eebd82SJames Collins 1969a8eebd82SJames Collins 1970a8eebd82SJames Collins /** 1971a8eebd82SJames Collins * Return inline theme icon 1972a8eebd82SJames Collins * 19739cff245bSJames Collins * @param string $type Icon to retreive. 19749cff245bSJames Collins * @return string HTML icon content 1975a8eebd82SJames Collins */ 19769cff245bSJames Collins public function mikioInlineIcon(string $type) 197710b40067Snomadjimbob { 1978a8eebd82SJames Collins switch ($type) { 1979a8eebd82SJames Collins case 'wrench': 19809cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 19819cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,53.152542,1217.0847)"><path d="m 384,64 q 0,26 -19,45 -19,19 19829cff245bSJames Collins-45,19 -26,0 -45,-19 -19,-19 -19,-45 0,-26 19,-45 19,-19 45,-19 26,0 45,19 19,19 19,45 z m 644,420 -682,-682 q -37,-37 19839cff245bSJames Collins-90,-37 -52,0 -91,37 L 59,-90 Q 21,-54 21,0 21,53 59,91 L 740,772 Q 779,674 854.5,598.5 930,523 1028,484 z m 634,435 q 19849cff245bSJames Collins0,-39 -23,-106 Q 1592,679 1474.5,595.5 1357,512 1216,512 1031,512 899.5,643.5 768,775 768,960 q 0,185 131.5,316.5 131.5, 19859cff245bSJames Collins131.5 316.5,131.5 58,0 121.5,-16.5 63.5,-16.5 107.5,-46.5 16,-11 16,-28 0,-17 -16,-28 L 1152,1120 V 896 l 193,-107 q 5, 19869cff245bSJames Collins3 79,48.5 74,45.5 135.5,81 61.5,35.5 70.5,35.5 15,0 23.5,-10 8.5,-10 8.5,-25 z"/></g></svg>'; 1987a8eebd82SJames Collins case 'file': 19889cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 19899cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991"><path d="M 128,0 H 1152 V 768 19909cff245bSJames CollinsH 736 q -40,0 -68,28 -28,28 -28,68 v 416 H 128 V 0 z m 640,896 h 299 L 768,1195 V 896 z M 1280,768 V -32 q 0,-40 -28, 19919cff245bSJames Collins-68 -28,-28 -68,-28 H 96 q -40,0 -68,28 -28,28 -28,68 v 1344 q 0,40 28,68 28,28 68,28 h 544 q 40,0 88,-20 48,-20 76,-48 19929cff245bSJames Collinsl 408,-408 q 28,-28 48,-76 20,-48 20,-88 z" id="path2993" inkscape:connector-curvature="0" 19939cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 1994a8eebd82SJames Collins case 'gear': 19959cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 19969cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027"><path d="m 1024,640 q 0,106 19979cff245bSJames Collins-75,181 -75,75 -181,75 -106,0 -181,-75 -75,-75 -75,-181 0,-106 75,-181 75,-75 181,-75 106,0 181,75 75,75 75,181 z m 19989cff245bSJames Collins512,109 V 527 q 0,-12 -8,-23 -8,-11 -20,-13 l -185,-28 q -19,-54 -39,-91 35,-50 107,-138 10,-12 10,-25 0,-13 -9,-23 -27, 19999cff245bSJames Collins-37 -99,-108 -72,-71 -94,-71 -12,0 -26,9 l -138,108 q -44,-23 -91,-38 -16,-136 -29,-186 -7,-28 -36,-28 H 657 q -14,0 20009cff245bSJames Collins-24.5,8.5 Q 622,-111 621,-98 L 593,86 q -49,16 -90,37 L 362,16 Q 352,7 337,7 323,7 312,18 186,132 147,186 q -7,10 -7,23 20019cff245bSJames Collins0,12 8,23 15,21 51,66.5 36,45.5 54,70.5 -27,50 -41,99 L 29,495 Q 16,497 8,507.5 0,518 0,531 v 222 q 0,12 8,23 8,11 19, 20029cff245bSJames Collins13 l 186,28 q 14,46 39,92 -40,57 -107,138 -10,12 -10,24 0,10 9,23 26,36 98.5,107.5 72.5,71.5 94.5,71.5 13,0 26,-10 l 20039cff245bSJames Collins138,-107 q 44,23 91,38 16,136 29,186 7,28 36,28 h 222 q 14,0 24.5,-8.5 Q 914,1391 915,1378 l 28,-184 q 49,-16 90,-37 l 20049cff245bSJames Collins142,107 q 9,9 24,9 13,0 25,-10 129,-119 165,-170 7,-8 7,-22 0,-12 -8,-23 -15,-21 -51,-66.5 -36,-45.5 -54,-70.5 26,-50 20059cff245bSJames Collins41,-98 l 183,-28 q 13,-2 21,-12.5 8,-10.5 8,-23.5 z" id="path3029" inkscape:connector-curvature="0" /></g></svg>'; 2006a8eebd82SJames Collins case 'user': 20079cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 20089cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M 1408,131 Q 1408,11 1335,-58.5 20099cff245bSJames Collins1262,-128 1141,-128 H 267 Q 146,-128 73,-58.5 0,11 0,131 0,184 3.5,234.5 7,285 17.5,343.5 28,402 44,452 q 16,50 43,97.5 20109cff245bSJames Collins27,47.5 62,81 35,33.5 85.5,53.5 50.5,20 111.5,20 9,0 42,-21.5 33,-21.5 74.5,-48 41.5,-26.5 108,-48 Q 637,565 704,565 q 20119cff245bSJames Collins67,0 133.5,21.5 66.5,21.5 108,48 41.5,26.5 74.5,48 33,21.5 42,21.5 61,0 111.5,-20 50.5,-20 85.5,-53.5 35,-33.5 62,-81 20129cff245bSJames Collins27,-47.5 43,-97.5 16,-50 26.5,-108.5 10.5,-58.5 14,-109 Q 1408,184 1408,131 z m -320,893 Q 1088,865 975.5,752.5 863,640 20139cff245bSJames Collins704,640 545,640 432.5,752.5 320,865 320,1024 320,1183 432.5,1295.5 545,1408 704,1408 863,1408 975.5,1295.5 1088,1183 20149cff245bSJames Collins1088,1024 z"/></g></svg>'; 2015a8eebd82SJames Collins case 'search': 20169cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" 20179cff245bSJames 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 20189cff245bSJames 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 20199cff245bSJames 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 20209cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>'; 2021a8eebd82SJames Collins case 'home': 20229cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 20239cff245bSJames Collinsaria-hidden="true" style="fill:currentColor"><g transform="matrix(1,0,0,-1,68.338983,1285.4237)" id="g3015"> 20249cff245bSJames Collins<path d="M 1408,544 V 64 Q 1408,38 1389,19 1370,0 1344,0 H 960 V 384 H 704 V 0 H 320 q -26,0 -45,19 -19,19 -19, 20259cff245bSJames Collins45 v 480 q 0,1 0.5,3 0.5,2 0.5,3 l 575,474 575,-474 q 1,-2 1,-6 z m 223,69 -62,-74 q -8,-9 -21,-11 h -3 q -13, 20269cff245bSJames Collins0 -21,7 L 832,1112 140,535 q -12,-8 -24,-7 -13,2 -21,11 l -62,74 q -8,10 -7,23.5 1,13.5 11,21.5 l 719, 20279cff245bSJames Collins599 q 32,26 76,26 44,0 76,-26 l 244,-204 v 195 q 0,14 9,23 9,9 23,9 h 192 q 14,0 23,-9 9,-9 9,-23 V 840 l 219, 20289cff245bSJames Collins-182 q 10,-8 11,-21.5 1,-13.5 -7,-23.5 z" id="path3017" inkscape:connector-curvature="0" 20299cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 20309cff245bSJames Collins }//end switch 2031ab45ba71SJames Collins 2032a8eebd82SJames Collins return ''; 2033a8eebd82SJames Collins } 2034ab45ba71SJames Collins 2035a8eebd82SJames Collins /** 2036a8eebd82SJames Collins * Finalize theme 20379cff245bSJames Collins * 20389cff245bSJames Collins * @return void 2039a8eebd82SJames Collins */ 204010b40067Snomadjimbob public function finalize() 204110b40067Snomadjimbob { 2042a8eebd82SJames Collins } 20431785fc73SJames Collins 20441785fc73SJames Collins /** 20451785fc73SJames Collins * Show Messages 20469cff245bSJames Collins * 20479cff245bSJames Collins * @return void 20481785fc73SJames Collins */ 204910b40067Snomadjimbob public function showMessages() 205010b40067Snomadjimbob { 20511785fc73SJames Collins global $ACT; 20521785fc73SJames Collins 20539cff245bSJames Collins if ($this->lessIgnored === true) { 20549cff245bSJames Collins msg( 20559cff245bSJames Collins 'useLESS is enabled on the Mikio template, however is not supported on this server', 20569cff245bSJames Collins 2, 20579cff245bSJames Collins '', 20589cff245bSJames Collins '', 20599cff245bSJames Collins MSG_ADMINS_ONLY 20609cff245bSJames Collins ); 2061a8df40efSJames Collins } 2062a8df40efSJames Collins 20631785fc73SJames Collins $show = $this->getConf('showNotifications'); 20643a385f2cSJames Collins if ( 20653a385f2cSJames Collins strcasecmp($show, 'always') === 0 || 20663a385f2cSJames Collins (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0) 20673a385f2cSJames Collins ) { 20681785fc73SJames Collins global $MSG, $MSG_shown; 20691785fc73SJames Collins 20709cff245bSJames Collins if (isset($MSG) === false) { 20711785fc73SJames Collins return; 20721785fc73SJames Collins } 20731785fc73SJames Collins 20749cff245bSJames Collins if (isset($MSG_shown) === false) { 20759cff245bSJames Collins $MSG_shown = []; 2076a8df40efSJames Collins } 20771785fc73SJames Collins 20781785fc73SJames Collins foreach ($MSG as $msg) { 20791785fc73SJames Collins $hash = md5($msg['msg']); 20809cff245bSJames Collins if (isset($MSG_shown[$hash]) === true) { 20811785fc73SJames Collins continue; 20821785fc73SJames Collins } 20831785fc73SJames Collins // skip double messages 20841785fc73SJames Collins 20859cff245bSJames Collins if (info_msg_allowed($msg) === true) { 20869cff245bSJames Collins echo '<div class="' . $msg['lvl'] . '">'; 20879cff245bSJames Collins echo $msg['msg']; 20889cff245bSJames Collins echo '</div>'; 20891785fc73SJames Collins } 20901785fc73SJames Collins 2091a8df40efSJames Collins $MSG_shown[$hash] = true; 20921785fc73SJames Collins } 20931785fc73SJames Collins 20941785fc73SJames Collins unset($GLOBALS['MSG']); 20959cff245bSJames Collins }//end if 20961785fc73SJames Collins } 20977ac0a6efSJames Collins 20987ac0a6efSJames Collins /** 20997ac0a6efSJames Collins * Dokuwiki version 21007ac0a6efSJames Collins * 21017ac0a6efSJames Collins * @return string the dw version name 21027ac0a6efSJames Collins */ 21039cff245bSJames Collins public function dwVersion() 21049cff245bSJames Collins { 21059cff245bSJames Collins if (function_exists('getVersionData') === true) { 21067ac0a6efSJames Collins $version_data = getVersionData(); 21079cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 21087ac0a6efSJames Collins $version_items = explode(' ', $version_data['date']); 21097ac0a6efSJames Collins if (count($version_items) >= 2) { 21107ac0a6efSJames Collins return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1])); 21117ac0a6efSJames Collins } 21127ac0a6efSJames Collins } 21137ac0a6efSJames Collins } 21147ac0a6efSJames Collins 21157ac0a6efSJames Collins return 'unknown'; 21167ac0a6efSJames Collins } 2117e4c4fb13SJames Collins 2118e4c4fb13SJames Collins /** 2119e4c4fb13SJames Collins * Dokuwiki version number 2120e4c4fb13SJames Collins * 2121e4c4fb13SJames Collins * @return string the dw version date converted to integer 2122e4c4fb13SJames Collins */ 21239cff245bSJames Collins public function dwVersionNumber() 21249cff245bSJames Collins { 21259cff245bSJames Collins if (function_exists('getVersionData') === true) { 2126e4c4fb13SJames Collins $version_data = getVersionData(); 21279cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 2128e4c4fb13SJames Collins $version_items = explode(' ', $version_data['date']); 2129e4c4fb13SJames Collins if (count($version_items) >= 1) { 2130e4c4fb13SJames Collins return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0]))); 2131e4c4fb13SJames Collins } 2132e4c4fb13SJames Collins } 2133e4c4fb13SJames Collins } 2134e4c4fb13SJames Collins 2135e4c4fb13SJames Collins return 0; 2136e4c4fb13SJames Collins } 2137a8eebd82SJames Collins} 2138ab45ba71SJames Collins 2139ab45ba71SJames Collinsglobal $TEMPLATE; 214047161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance(); 2141