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'], 32112030b10SJames 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 69612030b10SJames Collins if ($this->getConf('showLightDark') === true) { 6979e41d878SJames Collins $html .= '<li class="mikio-darklight"> 6989e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' . 6999e41d878SJames Collins$this->mikioInlineIcon('sun', 'mikio-darklight-light') . 7009e41d878SJames Collins$this->mikioInlineIcon('moon', 'mikio-darklight-dark') . 7019e41d878SJames Collins'</a></li>'; 70212030b10SJames Collins } 70312030b10SJames Collins 704ab45ba71SJames Collins $html .= '</ul>'; 705ab45ba71SJames Collins 7069cff245bSJames Collins if ($print === true) { 7079cff245bSJames Collins echo $html; 7089cff245bSJames Collins } 709a8eebd82SJames Collins return $html; 710a8eebd82SJames Collins } 711a8eebd82SJames Collins 712a8eebd82SJames Collins 713a8eebd82SJames Collins /** 714a8eebd82SJames Collins * Create a nav element from a string. <uri>|<title>; 715a8eebd82SJames Collins * 7169cff245bSJames Collins * @param string $str String to generate nav. 717a8eebd82SJames Collins * @return string nav elements generated 718a8eebd82SJames Collins */ 7199cff245bSJames Collins public function stringToNav(string $str) 72010b40067Snomadjimbob { 721a8eebd82SJames Collins $html = ''; 722a8eebd82SJames Collins 7233a385f2cSJames Collins if (empty($str) === false) { 724a8eebd82SJames Collins $items = explode(';', $str); 725a8eebd82SJames Collins if (count($items) > 0) { 726a8eebd82SJames Collins $html .= '<ul class="mikio-nav">'; 727a8eebd82SJames Collins foreach ($items as $item) { 728a8eebd82SJames Collins $parts = explode('|', $item); 729a8eebd82SJames Collins if ($parts > 1) { 7309cff245bSJames Collins $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' . 7319cff245bSJames Collins strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) . 7329cff245bSJames Collins '</a></li>'; 733a8eebd82SJames Collins } 734a8eebd82SJames Collins } 735a8eebd82SJames Collins $html .= '</ul>'; 736a8eebd82SJames Collins } 7372b4583abSJames Collins } 7382b4583abSJames Collins 739ab45ba71SJames Collins return $html; 7402b4583abSJames Collins } 7412b4583abSJames Collins 742a8eebd82SJames Collins /** 743ab45ba71SJames Collins * print or return the main navbar 7442b4583abSJames Collins * 7459cff245bSJames Collins * @param boolean $print Print the navbar. 7469cff245bSJames Collins * @param boolean $showSub Include the sub navbar. 747ab45ba71SJames Collins * @return string generated content 7482b4583abSJames Collins */ 7499cff245bSJames Collins public function includeNavbar(bool $print = true, bool $showSub = false) 75010b40067Snomadjimbob { 751b39ad16dSJames Collins global $conf, $USERINFO; 752d3d7d2b7SJames Collins 753d3d7d2b7SJames Collins $homeUrl = wl(); 754d3d7d2b7SJames Collins 7559cff245bSJames Collins if (plugin_isdisabled('showpageafterlogin') === false) { 756d3d7d2b7SJames Collins $p = &plugin_load('action', 'showpageafterlogin'); 7573a385f2cSJames Collins if (empty($p) === false) { 7589cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 759d3d7d2b7SJames Collins $homeUrl = wl($p->getConf('page_after_login')); 760d3d7d2b7SJames Collins } 761d3d7d2b7SJames Collins } 762b39ad16dSJames Collins } else { 7639cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 764b39ad16dSJames Collins $url = $this->getConf('brandURLUser'); 765b39ad16dSJames Collins if (strlen($url) > 0) { 766b39ad16dSJames Collins $homeUrl = $url; 767d3d7d2b7SJames Collins } 768b39ad16dSJames Collins } else { 769b39ad16dSJames Collins $url = $this->getConf('brandURLGuest'); 770b39ad16dSJames Collins if (strlen($url) > 0) { 771b39ad16dSJames Collins $homeUrl = $url; 772b39ad16dSJames Collins } 773b39ad16dSJames Collins } 774b39ad16dSJames Collins } 775d3d7d2b7SJames Collins 776ab45ba71SJames Collins $html = ''; 77747161538SJames Collins 7789cff245bSJames Collins $html .= '<nav class="mikio-navbar' . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') . 7799cff245bSJames Collins '">'; 780f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 781d3d7d2b7SJames Collins $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">'; 7829cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) { 783ab45ba71SJames Collins // Brand image 7849cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true) { 7859cff245bSJames Collins $logo = $this->getMediaFile('logo', false); 7869cff245bSJames Collins ; 7873a385f2cSJames Collins if (empty($logo) === false) { 788f0241fc4SJames Collins $width = $this->getConf('navbarTitleIconWidth'); 789f0241fc4SJames Collins $height = $this->getConf('navbarTitleIconHeight'); 790f0241fc4SJames Collins $styles = ''; 791f0241fc4SJames Collins 792f0241fc4SJames Collins if (strlen($width) > 0 || strlen($height) > 0) { 7939cff245bSJames Collins if (ctype_digit($width) === true) { 794f0241fc4SJames Collins $styles .= 'max-width:' . intval($width) . 'px;'; 7959cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) { 796f0241fc4SJames Collins $styles .= 'max-width:' . $width . ';'; 7979cff245bSJames Collins } elseif (strcasecmp($width, 'none') === 0) { 7987a92c19bSJames Collins $styles .= 'max-width:none;'; 799f0241fc4SJames Collins } 800f0241fc4SJames Collins 8019cff245bSJames Collins if (ctype_digit($height) === true) { 802f0241fc4SJames Collins $styles .= 'max-height:' . intval($height) . 'px;'; 8039cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) { 804f0241fc4SJames Collins $styles .= 'max-height:' . $height . ';'; 8059cff245bSJames Collins } elseif (strcasecmp($height, 'none') === 0) { 8067a92c19bSJames Collins $styles .= 'max-height:none;'; 807f0241fc4SJames Collins } 808f0241fc4SJames Collins 809f0241fc4SJames Collins if (strlen($styles) > 0) { 810f0241fc4SJames Collins $styles = ' style="' . $styles . '"'; 811f0241fc4SJames Collins } 8129cff245bSJames Collins }//end if 813f0241fc4SJames Collins 814f0241fc4SJames Collins $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>'; 8159cff245bSJames Collins }//end if 8169cff245bSJames Collins }//end if 817ab45ba71SJames Collins 818ab45ba71SJames Collins // Brand title 8199cff245bSJames Collins if ($this->getConf('navbarUseTitleText') === true) { 820ab45ba71SJames Collins $html .= '<div class="mikio-navbar-brand-title">'; 821a8eebd82SJames Collins $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>'; 8229cff245bSJames Collins if ($this->getConf('navbarUseTaglineText') === true) { 823a8eebd82SJames Collins $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>'; 824ab45ba71SJames Collins } 825ab45ba71SJames Collins $html .= '</div>'; 826ab45ba71SJames Collins } 8279cff245bSJames Collins }//end if 828ab45ba71SJames Collins $html .= '</a>'; 829660b2c71SJames Collins $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>'; 830ab45ba71SJames Collins 831ab45ba71SJames Collins // Menus 832ab45ba71SJames Collins $html .= '<div class="mikio-navbar-collapse">'; 833ab45ba71SJames Collins 8349cff245bSJames Collins $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'), 8359cff245bSJames Collins $this->getConf('navbarPosRight', 'none') 8369cff245bSJames Collins ]; 837a8eebd82SJames Collins foreach ($menus as $menuType) { 838a8eebd82SJames Collins switch ($menuType) { 839a8eebd82SJames Collins case 'custom': 840a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', '')); 841a8eebd82SJames Collins break; 842a8eebd82SJames Collins case 'search': 843ab45ba71SJames Collins $html .= '<div class="mikio-nav-item">'; 844ab45ba71SJames Collins $html .= $this->includeSearch(false); 845ab45ba71SJames Collins $html .= '</div>'; 846a8eebd82SJames Collins break; 847a8eebd82SJames Collins case 'dokuwiki': 8489cff245bSJames Collins $html .= $this->includeDWMenu(false); 849a8eebd82SJames Collins break; 850a8eebd82SJames Collins } 851a8eebd82SJames Collins } 852ab45ba71SJames Collins 853ab45ba71SJames Collins $html .= '</div>'; 854f8039bf2SJames Collins $html .= '</div>'; 855ab45ba71SJames Collins $html .= '</nav>'; 856ab45ba71SJames Collins 857a8eebd82SJames Collins // Sub Navbar 8589cff245bSJames Collins if ($showSub === true) { 8599cff245bSJames Collins $sub = $this->includePage('submenu', false); 8603a385f2cSJames Collins if (empty($sub) === false) { 8619cff245bSJames Collins $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>'; 8629cff245bSJames Collins } 863ab45ba71SJames Collins } 864ab45ba71SJames Collins 8659cff245bSJames Collins if ($print === true) { 8669cff245bSJames Collins echo $html; 8679cff245bSJames Collins } 868ab45ba71SJames Collins return $html; 869ab45ba71SJames Collins } 870ab45ba71SJames Collins 871ab45ba71SJames Collins 872a8eebd82SJames Collins /** 873a8eebd82SJames Collins * Is there a sidebar 874a8eebd82SJames Collins * 8759cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 876a8eebd82SJames Collins * @return boolean if sidebar exists 877a8eebd82SJames Collins */ 8789cff245bSJames Collins public function sidebarExists(string $prefix = '') 87910b40067Snomadjimbob { 880a8eebd82SJames Collins global $conf; 881a8eebd82SJames Collins 8823a385f2cSJames Collins if (strcasecmp($prefix, 'left') === 0) { 8839cff245bSJames Collins $prefix = ''; 8849cff245bSJames Collins } 885a8eebd82SJames Collins 886a8eebd82SJames Collins return $this->pageExists($conf['sidebar' . $prefix]); 887a8eebd82SJames Collins } 888a8eebd82SJames Collins 889a8eebd82SJames Collins 890a8eebd82SJames Collins /** 891ab45ba71SJames Collins * Print or return the sidebar content 892ab45ba71SJames Collins * 8939cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 8949cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 8959cff245bSJames Collins * @param boolean $parse Parse the content. 896ab45ba71SJames Collins * @return string generated content 897ab45ba71SJames Collins */ 8989cff245bSJames Collins public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true) 89910b40067Snomadjimbob { 900ab45ba71SJames Collins global $conf, $ID; 901ab45ba71SJames Collins 902ab45ba71SJames Collins $html = ''; 903ab45ba71SJames Collins $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix)); 904ab45ba71SJames Collins $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix)); 905ab45ba71SJames Collins 9063a385f2cSJames Collins if (empty($confPrefix) === true) { 9079cff245bSJames Collins $confPrefix = 'Left'; 9089cff245bSJames Collins } 9091cdedf28SJames Collins if (strcasecmp($prefix, 'left') === 0) { 9109cff245bSJames Collins $prefix = ''; 9119cff245bSJames Collins } 912ab45ba71SJames Collins 9131cdedf28SJames Collins $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar']; 914ab45ba71SJames Collins 9159cff245bSJames Collins if ( 9169cff245bSJames Collins $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false && 9171cdedf28SJames Collins p_get_metadata($ID, 'nosidebar', false) === null 9189cff245bSJames Collins ) { 9199cff245bSJames Collins $content = $this->includePage($sidebarPage . 'header', false); 9203a385f2cSJames Collins if (empty($content) === false) { 9219cff245bSJames Collins $html .= '<div class="mikio-sidebar-header">' . $content . '</div>'; 9229cff245bSJames Collins } 923ab45ba71SJames Collins 9243a385f2cSJames Collins if (empty($prefix) === true) { 9259cff245bSJames Collins $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'), 9269cff245bSJames Collins $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4') 9279cff245bSJames Collins ]; 928ab45ba71SJames Collins 929a8eebd82SJames Collins foreach ($rows as $row) { 930a8eebd82SJames Collins switch ($row) { 931a8eebd82SJames Collins case 'search': 9329cff245bSJames Collins $html .= $this->includeSearch(false); 933a8eebd82SJames Collins break; 934a8eebd82SJames Collins case 'logged in user': 9359cff245bSJames Collins $html .= $this->includeLoggedIn(false); 936a8eebd82SJames Collins break; 937a8eebd82SJames Collins case 'content': 9389cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 9393a385f2cSJames Collins if (empty($content) === false) { 9409cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 9419cff245bSJames Collins } 942a8eebd82SJames Collins break; 943a8eebd82SJames Collins case 'tags': 944a8eebd82SJames Collins $html .= '<div class="mikio-tags"></div>'; 945a8eebd82SJames Collins } 946a8eebd82SJames Collins } 947a8eebd82SJames Collins } else { 9489cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 9493a385f2cSJames Collins if (empty($content) === false) { 9509cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 9519cff245bSJames Collins } 9529cff245bSJames Collins }//end if 9539cff245bSJames Collins 9549cff245bSJames Collins $content = $this->includePage($sidebarPage . 'footer', false); 9553a385f2cSJames Collins if (empty($content) === false) { 9569cff245bSJames Collins $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>'; 9579cff245bSJames Collins } 9589cff245bSJames Collins }//end if 9599cff245bSJames Collins 9603a385f2cSJames Collins if (empty($html) === true) { 9613a385f2cSJames Collins if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) { 9629cff245bSJames Collins $html = ' '; 9639cff245bSJames Collins } 9649cff245bSJames Collins if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) { 9659cff245bSJames Collins $html = ' '; 9669cff245bSJames Collins } 967a8eebd82SJames Collins } 968ab45ba71SJames Collins 9693a385f2cSJames Collins if (empty($html) === false) { 9701cdedf28SJames Collins $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) . 9719cff245bSJames Collins '"><a class="mikio-sidebar-toggle' . 9729cff245bSJames Collins ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' . 9739cff245bSJames Collins tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' . 9749cff245bSJames Collins $html . '</div></aside>'; 975ab45ba71SJames Collins } 976ab45ba71SJames Collins 9779cff245bSJames Collins if ($parse === true) { 9789cff245bSJames Collins $html = $this->includeIcons($html); 9793a04a100SJames Collins } 9809cff245bSJames Collins if ($print === true) { 9819cff245bSJames Collins echo $html; 982ab45ba71SJames Collins } 983ab45ba71SJames Collins return $html; 984ab45ba71SJames Collins } 985ab45ba71SJames Collins 986ab45ba71SJames Collins 987a8eebd82SJames Collins /** 988ab45ba71SJames Collins * Print or return the page tools content 989ab45ba71SJames Collins * 9909cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 9919cff245bSJames Collins * @param boolean $includeId Include the dw__pagetools id in the element. 992ab45ba71SJames Collins * @return string generated content 993ab45ba71SJames Collins */ 9949cff245bSJames Collins public function includePageTools(bool $print = true, bool $includeId = false) 99510b40067Snomadjimbob { 9961293ce10SJames Collins global $USERINFO; 9971293ce10SJames Collins 9989cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 999ab45ba71SJames Collins $html = ''; 1000ab45ba71SJames Collins 10019cff245bSJames Collins $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">'; 1002b9c0582bSJames Collins $html .= '<ul class="tools">'; 1003ab45ba71SJames Collins 1004ab45ba71SJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 1005ab45ba71SJames Collins foreach ($items as $item) { 10069cff245bSJames Collins $classes = []; 10073fd763a0SJames Collins $classes[] = $item->getType(); 10083fd763a0SJames Collins $attr = $item->getLinkAttributes(); 10093fd763a0SJames Collins 10109cff245bSJames Collins if (empty($attr['class']) === false) { 10113fd763a0SJames Collins $classes = array_merge($classes, explode(' ', $attr['class'])); 1012ab45ba71SJames Collins } 1013ab45ba71SJames Collins 10143fd763a0SJames Collins $classes = array_unique($classes); 10153fd763a0SJames Collins 10161293ce10SJames Collins $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType())); 10179cff245bSJames Collins if ( 10183a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 10193a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 10203a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true)) 10219cff245bSJames Collins ) { 10223fd763a0SJames Collins $html .= '<li class="' . implode(' ', $classes) . '">'; 10239cff245bSJames Collins $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' . 10249cff245bSJames Collins $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) . 10259cff245bSJames Collins '</div><span class="a11y">' . $item->getLabel() . '</span></a>'; 10263fd763a0SJames Collins $html .= '</li>'; 10273fd763a0SJames Collins } 10289cff245bSJames Collins }//end foreach 10293fd763a0SJames Collins 10303fd763a0SJames Collins $html .= '</ul>'; 1031ab45ba71SJames Collins $html .= '</nav>'; 1032ab45ba71SJames Collins 10339cff245bSJames Collins if ($print === true) { 10349cff245bSJames Collins echo $html; 10359cff245bSJames Collins } 1036ab45ba71SJames Collins return $html; 1037ab45ba71SJames Collins } 1038ab45ba71SJames Collins 1039ab45ba71SJames Collins 1040a8eebd82SJames Collins /** 1041a8eebd82SJames Collins * Print or return the search bar 1042a8eebd82SJames Collins * 10439cff245bSJames Collins * @param boolean $print Print content. 1044a8eebd82SJames Collins * @return string contents of the search bar 1045a8eebd82SJames Collins */ 10469cff245bSJames Collins public function includeSearch(bool $print = true) 104710b40067Snomadjimbob { 10489cff245bSJames Collins global $lang, $ID, $ACT, $QUERY; 1049ab45ba71SJames Collins $html = ''; 1050ab45ba71SJames Collins 10519cff245bSJames Collins $html .= '<form class="mikio-search search" action="' . wl() . 10529cff245bSJames Collins '" accept-charset="utf-8" method="get" role="search">'; 1053a8eebd82SJames Collins $html .= '<input type="hidden" name="do" value="search">'; 1054a8eebd82SJames Collins $html .= '<input type="hidden" name="id" value="' . $ID . '">'; 1055c1cb9f15SChris MacMackin $html .= '<input name="q" '; 10569cff245bSJames Collins if ($this->getConf('searchUseTypeahead') === true) { 1057c1cb9f15SChris MacMackin $html .= 'class="search_typeahead" '; 1058c1cb9f15SChris MacMackin } 10599cff245bSJames Collins $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' . 10603a385f2cSJames Collins ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />'; 1061a8eebd82SJames Collins $html .= '<button type="submit" title="' . $lang['btn_search'] . '">'; 10623a385f2cSJames Collins if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) { 1063a8eebd82SJames Collins $html .= $this->mikioInlineIcon('search'); 1064ab45ba71SJames Collins } else { 1065ab45ba71SJames Collins $html .= $lang['btn_search']; 1066ab45ba71SJames Collins } 1067ab45ba71SJames Collins $html .= '</button>'; 1068ab45ba71SJames Collins $html .= '</form>'; 1069ab45ba71SJames Collins 10709cff245bSJames Collins if ($print === true) { 10719cff245bSJames Collins echo $html; 10729cff245bSJames Collins } 1073ab45ba71SJames Collins return $html; 1074ab45ba71SJames Collins } 1075ab45ba71SJames Collins 1076ab45ba71SJames Collins 1077a8eebd82SJames Collins /** 1078a8eebd82SJames Collins * Print or return content 1079a8eebd82SJames Collins * 10809cff245bSJames Collins * @param boolean $print Print content. 1081a8eebd82SJames Collins * @return string contents 1082a8eebd82SJames Collins */ 10839cff245bSJames Collins public function includeContent(bool $print = true) 108410b40067Snomadjimbob { 1085ab45ba71SJames Collins ob_start(); 10869cff245bSJames Collins tpl_content(false); 1087ab45ba71SJames Collins $html = ob_get_contents(); 1088ab45ba71SJames Collins ob_end_clean(); 1089ab45ba71SJames Collins 1090ab45ba71SJames Collins $html = $this->includeIcons($html); 1091ab45ba71SJames Collins $html = $this->parseContent($html); 1092ab45ba71SJames Collins 1093ab45ba71SJames Collins $html .= '<div style="clear:both"></div>'; 1094ab45ba71SJames Collins 10959cff245bSJames Collins if ($this->getConf('heroTitle') === false) { 10969cff245bSJames Collins $html = '<div class="mikio-tags"></div>' . $html; 10979cff245bSJames Collins } 1098a8eebd82SJames Collins 1099a8eebd82SJames Collins $html = '<div class="mikio-article-content">' . $html . '</div>'; 1100a8eebd82SJames Collins 11019cff245bSJames Collins if ($print === true) { 11029cff245bSJames Collins echo $html; 11039cff245bSJames Collins } 1104ab45ba71SJames Collins return $html; 1105ab45ba71SJames Collins } 1106ab45ba71SJames Collins 1107a8eebd82SJames Collins /** 1108ab45ba71SJames Collins * Print or return footer 1109ab45ba71SJames Collins * 11109cff245bSJames Collins * @param boolean $print Print footer. 11119cff245bSJames Collins * @return string HTML string containing footer 1112ab45ba71SJames Collins */ 11139cff245bSJames Collins public function includeFooter(bool $print = true) 111410b40067Snomadjimbob { 1115ab45ba71SJames Collins global $ACT; 1116ab45ba71SJames Collins 1117ab45ba71SJames Collins $html = ''; 1118ab45ba71SJames Collins 1119ab45ba71SJames Collins $html .= '<footer class="mikio-footer">'; 11209cff245bSJames Collins $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>'; 11219cff245bSJames Collins $html .= $this->includePage('footer', false); 1122ab45ba71SJames Collins 1123a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('footerCustomMenuText')); 1124ab45ba71SJames Collins 11259cff245bSJames Collins if ($this->getConf('footerSearch') === true) { 1126ab45ba71SJames Collins $html .= '<div class="mikio-footer-search">'; 11279cff245bSJames Collins $html .= $this->includeSearch(false); 1128ab45ba71SJames Collins $html .= '</div>'; 1129ab45ba71SJames Collins } 1130ab45ba71SJames Collins 1131a8eebd82SJames Collins $showPageTools = $this->getConf('pageToolsFooter'); 11329cff245bSJames Collins if ( 11333a385f2cSJames Collins strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 || 11343a385f2cSJames Collins $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0) 11359cff245bSJames Collins ) { 11369cff245bSJames Collins $html .= $this->includePageTools(false); 11379cff245bSJames Collins } 1138ab45ba71SJames Collins 11399cff245bSJames Collins $meta['licenseType'] = ['multichoice', '_choices' => ['none', 'badge', 'button']]; 11409cff245bSJames Collins $meta['licenseImageOnly'] = ['onoff']; 1141ab45ba71SJames Collins 1142ab45ba71SJames Collins $licenseType = $this->getConf('licenseType'); 11439cff245bSJames Collins if ($licenseType !== 'none') { 11449cff245bSJames Collins $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true); 1145ab45ba71SJames Collins } 1146ab45ba71SJames Collins 1147ab45ba71SJames Collins $html .= '</footer>'; 1148ab45ba71SJames Collins 11499cff245bSJames Collins if ($print === true) { 11509cff245bSJames Collins echo $html; 11519cff245bSJames Collins } 1152ab45ba71SJames Collins return $html; 1153ab45ba71SJames Collins } 1154ab45ba71SJames Collins 1155ab45ba71SJames Collins 1156a8eebd82SJames Collins /** 1157ab45ba71SJames Collins * Print or return breadcrumb trail 1158ab45ba71SJames Collins * 11599cff245bSJames Collins * @param boolean $print Print out trail. 11609cff245bSJames Collins * @param boolean $parse Parse trail before printing. 11619cff245bSJames Collins * @return string HTML string containing breadcrumbs 1162ab45ba71SJames Collins */ 11639cff245bSJames Collins public function includeBreadcrumbs(bool $print = true, bool $parse = true) 116410b40067Snomadjimbob { 1165a8eebd82SJames Collins global $conf, $ID, $lang, $ACT; 1166a8eebd82SJames Collins 11673a385f2cSJames Collins if ( 11683a385f2cSJames Collins $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 && 116995372bffSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0 11703a385f2cSJames Collins ) { 11719cff245bSJames Collins return ''; 11729cff245bSJames Collins } 1173ab45ba71SJames Collins 1174ab45ba71SJames Collins $html = '<div class="mikio-breadcrumbs">'; 1175f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 11763a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 117795372bffSJames Collins if ($conf['breadcrumbs'] !== 0) { 11789cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) { 1179ab45ba71SJames Collins ob_start(); 118075adba86SJames Collins tpl_breadcrumbs(); 1181ab45ba71SJames Collins $html .= ob_get_contents(); 1182ab45ba71SJames Collins ob_end_clean(); 1183ab45ba71SJames Collins } else { 1184ab45ba71SJames Collins $sep = '•'; 1185ab45ba71SJames Collins $prefix = $lang['breadcrumb']; 1186ab45ba71SJames Collins 11879cff245bSJames Collins if ($this->getConf('breadcrumbSep') === true) { 1188ab45ba71SJames Collins $sep = $this->getConf('breadcrumbSepText'); 11899cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-sep', false); 1190ab45ba71SJames Collins 11919cff245bSJames Collins if ($img !== false) { 1192ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1193ab45ba71SJames Collins } 119447161538SJames Collins } 119547161538SJames Collins 11969cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === true) { 1197ab45ba71SJames Collins $prefix = $this->getConf('breadcrumbPrefixText'); 11989cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-prefix', false); 1199ab45ba71SJames Collins 12009cff245bSJames Collins if ($img !== false) { 1201ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 1202ab45ba71SJames Collins } 1203ab45ba71SJames Collins } 1204ab45ba71SJames Collins 1205ab45ba71SJames Collins $crumbs = breadcrumbs(); 1206ab45ba71SJames Collins 1207ab45ba71SJames Collins $html .= '<ul>'; 12083a385f2cSJames Collins if (empty($prefix) === false) { 12099cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 12109cff245bSJames Collins } 1211ab45ba71SJames Collins 1212ab45ba71SJames Collins $last = count($crumbs); 1213ab45ba71SJames Collins $i = 0; 1214ab45ba71SJames Collins foreach ($crumbs as $id => $name) { 1215ab45ba71SJames Collins $i++; 121695372bffSJames Collins if ($i !== 1) { 1217ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 121895372bffSJames Collins } 12199cff245bSJames Collins $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>'; 12209cff245bSJames Collins $html .= tpl_pagelink($id, null, true); 1221ab45ba71SJames Collins $html .= '</li>'; 1222ab45ba71SJames Collins } 1223ab45ba71SJames Collins 1224ab45ba71SJames Collins $html .= '</ul>'; 12259cff245bSJames Collins }//end if 12269cff245bSJames Collins }//end if 12279cff245bSJames Collins }//end if 12283d11a778SJames Collins 12293d11a778SJames Collins $html .= '</div>'; 12303d11a778SJames Collins $html .= '</div>'; 12313d11a778SJames Collins 12329cff245bSJames Collins if ($parse === true) { 12339cff245bSJames Collins $html = $this->includeIcons($html); 12349cff245bSJames Collins } 12359cff245bSJames Collins if ($print === true) { 12369cff245bSJames Collins echo $html; 12379cff245bSJames Collins } 12383d11a778SJames Collins return $html; 12393d11a778SJames Collins } 12403d11a778SJames Collins 12413d11a778SJames Collins /** 12423d11a778SJames Collins * Print or return you are here trail 12433d11a778SJames Collins * 12449cff245bSJames Collins * @param boolean $print Print out trail. 12459cff245bSJames Collins * @param boolean $parse Parse trail before printing. 12469cff245bSJames Collins * @return string HTML string containing breadcrumbs 12473d11a778SJames Collins */ 12489cff245bSJames Collins public function includeYouAreHere(bool $print = true, bool $parse = true) 12493d11a778SJames Collins { 12503d11a778SJames Collins global $conf, $ID, $lang, $ACT; 12513d11a778SJames Collins 12523a385f2cSJames Collins if ( 12533a385f2cSJames Collins $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 && 125495372bffSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0 12553a385f2cSJames Collins ) { 12569cff245bSJames Collins return ''; 12579cff245bSJames Collins } 12583d11a778SJames Collins 12593d11a778SJames Collins $html = '<div class="mikio-youarehere">'; 12603d11a778SJames Collins $html .= '<div class="mikio-container">'; 12613a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 126295372bffSJames Collins if ($conf['youarehere'] !== 0) { 12639cff245bSJames Collins if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) { 126495372bffSJames Collins $html .= '<div class="mikio-bcdw">'; 1265ab45ba71SJames Collins ob_start(); 126675adba86SJames Collins tpl_youarehere(); 1267ab45ba71SJames Collins $html .= ob_get_contents(); 1268ab45ba71SJames Collins ob_end_clean(); 126995372bffSJames Collins $html .= '</div>'; 1270ab45ba71SJames Collins } else { 1271ab45ba71SJames Collins $sep = ' » '; 1272ab45ba71SJames Collins $prefix = $lang['youarehere']; 1273ab45ba71SJames Collins 12749cff245bSJames Collins if ($this->getConf('youarehereSep') === true) { 12753d11a778SJames Collins $sep = $this->getConf('youarehereSepText'); 12769cff245bSJames Collins $img = $this->getMediaFile('youarehere-sep', false); 1277ab45ba71SJames Collins 12789cff245bSJames Collins if ($img !== false) { 1279ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1280ab45ba71SJames Collins } 128175adba86SJames Collins } 128275adba86SJames Collins 12839cff245bSJames Collins if ($this->getConf('youareherePrefix') === true) { 12843d11a778SJames Collins $prefix = $this->getConf('youareherePrefixText'); 12859cff245bSJames Collins $img = $this->getMediaFile('youarehere-prefix', false); 1286ab45ba71SJames Collins 12879cff245bSJames Collins if ($img !== false) { 1288ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 128975adba86SJames Collins } 129047161538SJames Collins } 129147161538SJames Collins 1292ab45ba71SJames Collins $html .= '<ul>'; 12933a385f2cSJames Collins if (empty($prefix) === false) { 12949cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 12959cff245bSJames Collins } 12969cff245bSJames Collins $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>'; 1297ab45ba71SJames Collins 1298ab45ba71SJames Collins $parts = explode(':', $ID); 1299ab45ba71SJames Collins $count = count($parts); 1300ab45ba71SJames Collins 1301ab45ba71SJames Collins $part = ''; 13029cff245bSJames Collins for ($i = 0; $i < ($count - 1); $i++) { 1303ab45ba71SJames Collins $part .= $parts[$i] . ':'; 1304ab45ba71SJames Collins $page = $part; 13059cff245bSJames Collins if ($page === $conf['start']) { 13069cff245bSJames Collins continue; 13079cff245bSJames Collins } 1308ab45ba71SJames Collins 1309ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 13109cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1311ab45ba71SJames Collins } 1312ab45ba71SJames Collins 1313ab45ba71SJames Collins resolve_pageid('', $page, $exists); 13149cff245bSJames Collins if ((isset($page) === true && $page === $part . $parts[$i]) === false) { 1315ab45ba71SJames Collins $page = $part . $parts[$i]; 13169cff245bSJames Collins if ($page !== $conf['start']) { 1317ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 13189cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1319ab45ba71SJames Collins } 1320ab45ba71SJames Collins } 1321ab45ba71SJames Collins 1322ab45ba71SJames Collins $html .= '</ul>'; 13239cff245bSJames Collins }//end if 13249cff245bSJames Collins }//end if 1325ab45ba71SJames Collins 13263d11a778SJames Collins $showLast = $this->getConf('youarehereShowLast'); 13279cff245bSJames Collins if ($showLast !== 0) { 1328a8eebd82SJames Collins preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches); 13299cff245bSJames Collins if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) { 1330a8eebd82SJames Collins $count = count($matches[0]); 1331a8eebd82SJames Collins $list = ''; 1332a8eebd82SJames Collins 1333a8eebd82SJames Collins // Show Home 1334a8eebd82SJames Collins $list .= $matches[0][0] . $matches[0][1]; 1335a8eebd82SJames Collins 1336a8eebd82SJames Collins $list .= '<li>...</li>'; 13379cff245bSJames Collins for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) { 1338a8eebd82SJames Collins $list .= $matches[0][$i]; 1339a8eebd82SJames Collins } 1340a8eebd82SJames Collins 1341a8eebd82SJames Collins $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html); 1342a8eebd82SJames Collins } 1343a8eebd82SJames Collins } 1344a8eebd82SJames Collins 13453d11a778SJames Collins switch ($this->getConf('youarehereHome')) { 1346a8eebd82SJames Collins case 'none': 1347a8eebd82SJames Collins $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2); 1348a8eebd82SJames Collins break; 1349a8eebd82SJames Collins case 'home': 1350a8eebd82SJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1); 1351a8eebd82SJames Collins break; 1352a8eebd82SJames Collins case 'icon': 13539cff245bSJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . 13549cff245bSJames Collins $this->mikioInlineIcon('home') . '$3', $html, 1); 1355a8eebd82SJames Collins break; 1356a8eebd82SJames Collins } 1357a8eebd82SJames Collins } else { 1358a8eebd82SJames Collins $html .= '≪ '; 13599cff245bSJames Collins if (isset($_GET['page']) === true) { 13609cff245bSJames Collins $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a> / '; 1361a8eebd82SJames Collins } 13624057121fSJames Collins $html .= '<a href="' . wl($ID) . '">View Page</a>'; 13639cff245bSJames Collins }//end if 13649cff245bSJames Collins 13659cff245bSJames Collins $html .= '</div>'; 13669cff245bSJames Collins $html .= '</div>'; 13679cff245bSJames Collins 13689cff245bSJames Collins if ($parse === true) { 13699cff245bSJames Collins $html = $this->includeIcons($html); 1370a8eebd82SJames Collins } 13719cff245bSJames Collins if ($print === true) { 13729cff245bSJames Collins echo $html; 13739cff245bSJames Collins } 1374ab45ba71SJames Collins return $html; 1375ab45ba71SJames Collins } 1376ab45ba71SJames Collins 13771785fc73SJames Collins /** 13781785fc73SJames Collins * Get Page Title 13799cff245bSJames Collins * 13809cff245bSJames Collins * @return string page title 13811785fc73SJames Collins */ 138210b40067Snomadjimbob public function parsePageTitle() 138310b40067Snomadjimbob { 13842060e56cSJames Collins global $ID; 13852060e56cSJames Collins 13862060e56cSJames Collins $title = p_get_first_heading($ID); 13879cff245bSJames Collins if (strlen($title) <= 0) { 13889cff245bSJames Collins $title = tpl_pagetitle(null, true); 13899cff245bSJames Collins } 13901785fc73SJames Collins $title = $this->includeIcons($title); 13911785fc73SJames Collins 13921785fc73SJames Collins return $title; 13931785fc73SJames Collins } 13941785fc73SJames Collins 1395ab45ba71SJames Collins 139675adba86SJames Collins /** 1397a8eebd82SJames Collins * Print or return hero block 139875adba86SJames Collins * 13999cff245bSJames Collins * @param boolean $print Print content. 1400a8eebd82SJames Collins * @return string contents of hero 140175adba86SJames Collins */ 14029cff245bSJames Collins public function includeHero(bool $print = true) 140310b40067Snomadjimbob { 1404a8eebd82SJames Collins $html = ''; 140547161538SJames Collins 14069cff245bSJames Collins if ($this->getConf('heroTitle') === true) { 1407a8eebd82SJames Collins $html .= '<div class="mikio-hero">'; 1408f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 1409a8eebd82SJames Collins $html .= '<div class="mikio-hero-text">'; 14103a385f2cSJames Collins if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) { 14119cff245bSJames Collins $html .= $this->includeYouAreHere(false); 14129cff245bSJames Collins } 14133a385f2cSJames Collins if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) { 14149cff245bSJames Collins $html .= $this->includeBreadcrumbs(false); 14159cff245bSJames Collins } 1416ab45ba71SJames Collins 1417a8eebd82SJames Collins $html .= '<h1 class="mikio-hero-title">'; 14181785fc73SJames Collins $html .= $this->parsePageTitle(); // No idea why this requires a blank space afterwards to work? 1419a8eebd82SJames Collins $html .= '</h1>'; 1420a8eebd82SJames Collins $html .= '<h2 class="mikio-hero-subtitle"></h2>'; 1421a8eebd82SJames Collins $html .= '</div>'; 142247161538SJames Collins 14239cff245bSJames Collins $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true)); 1424a8eebd82SJames Collins $hero_image_resize_class = ''; 14253a385f2cSJames Collins if (empty($hero_image) === false) { 1426a8eebd82SJames Collins $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"'; 1427a8eebd82SJames Collins $hero_image_resize_class = ' mikio-hero-image-resize'; 142847161538SJames Collins } 1429a8eebd82SJames Collins 14309cff245bSJames Collins $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image . 14319cff245bSJames Collins '><div class="mikio-tags"></div></div>'; 1432a8eebd82SJames Collins 1433a8eebd82SJames Collins $html .= '</div>'; 1434f8039bf2SJames Collins $html .= '</div>'; 14359cff245bSJames Collins }//end if 14369cff245bSJames Collins 14379cff245bSJames Collins if ($print === true) { 14389cff245bSJames Collins echo $html; 143975adba86SJames Collins } 1440a8eebd82SJames Collins 1441a8eebd82SJames Collins return $html; 144275adba86SJames Collins } 144375adba86SJames Collins 144475adba86SJames Collins 144575adba86SJames Collins /** 1446a8eebd82SJames Collins * Print or return out TOC 144775adba86SJames Collins * 14489cff245bSJames Collins * @param boolean $print Print TOC. 14499cff245bSJames Collins * @param boolean $parse Parse icons. 1450a8eebd82SJames Collins * @return string contents of TOC 145175adba86SJames Collins */ 14529cff245bSJames Collins public function includeTOC(bool $print = true, bool $parse = true) 145310b40067Snomadjimbob { 1454ab45ba71SJames Collins $html = ''; 14552b4583abSJames Collins 1456ab45ba71SJames Collins $tocHtml = tpl_toc(true); 1457ab45ba71SJames Collins 14583a385f2cSJames Collins if (empty($tocHtml) === false) { 1459ab45ba71SJames Collins $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml); 1460a8eebd82SJames Collins $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml); 1461ab45ba71SJames Collins 1462ab45ba71SJames Collins $html .= '<div class="mikio-toc">'; 1463ab45ba71SJames Collins $html .= $tocHtml; 1464ab45ba71SJames Collins $html .= '</div>'; 14652b4583abSJames Collins } 14662b4583abSJames Collins 14679cff245bSJames Collins if ($parse === true) { 14689cff245bSJames Collins $html = $this->includeIcons($html); 14699cff245bSJames Collins } 14709cff245bSJames Collins 14719cff245bSJames Collins if ($print === true) { 1472ab45ba71SJames Collins echo $html; 1473ab45ba71SJames Collins } 1474ab45ba71SJames Collins 14759cff245bSJames Collins return $html; 14769cff245bSJames Collins } 14779cff245bSJames Collins 1478ab45ba71SJames Collins 1479a8eebd82SJames Collins /** 1480ab45ba71SJames Collins * Parse the string and replace icon elements with included icon libraries 1481ab45ba71SJames Collins * 14829cff245bSJames Collins * @param string $str Content to parse. 1483ab45ba71SJames Collins * @return string parsed string 1484ab45ba71SJames Collins */ 14859cff245bSJames Collins public function includeIcons(string $str) 148610b40067Snomadjimbob { 1487ab45ba71SJames Collins global $ACT, $MIKIO_ICONS; 1488ab45ba71SJames Collins 1489ab45ba71SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 14903a385f2cSJames Collins if (empty($iconTag) === true) { 14919cff245bSJames Collins return $str; 14929cff245bSJames Collins } 1493ab45ba71SJames Collins 14949cff245bSJames Collins if ( 14959cff245bSJames Collins in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true || 14963a385f2cSJames Collins strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0 14979cff245bSJames Collins ) { 1498a2005a27SJames Collins $content = $str; 1499a2005a27SJames Collins $preview = null; 1500a2005a27SJames Collins 15013a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 15029cff245bSJames Collins $html = new \simple_html_dom(); 1503a2005a27SJames Collins $html->stripRNAttrValues = false; 1504a2005a27SJames Collins $html->load($str, true, false); 1505a2005a27SJames Collins 1506a2005a27SJames Collins $preview = $html->find('div.preview'); 15079cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1508a2005a27SJames Collins $content = $preview[0]->innertext; 1509a2005a27SJames Collins } 1510a2005a27SJames Collins } 1511a2005a27SJames Collins 15121785fc73SJames Collins $page_regex = '/(.*)/'; 15139cff245bSJames Collins if (stripos($str, '<pre') !== false) { 15141785fc73SJames Collins $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/'; 15151785fc73SJames Collins } 15161785fc73SJames Collins 15171785fc73SJames Collins $content = preg_replace_callback($page_regex, function ($icons) { 1518a2005a27SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 1519a2005a27SJames Collins 152010b40067Snomadjimbob return preg_replace_callback( 152110b40067Snomadjimbob '/<' . $iconTag . ' ([\w\- #]*)>(?=[^>]*(<|$))/', 1522ab45ba71SJames Collins function ($matches) { 1523ab45ba71SJames Collins global $MIKIO_ICONS; 1524ab45ba71SJames Collins 1525ab45ba71SJames Collins $s = $matches[0]; 1526ab45ba71SJames Collins 1527ab45ba71SJames Collins if (count($MIKIO_ICONS) > 0) { 1528ab45ba71SJames Collins $icon = $MIKIO_ICONS[0]; 1529ab45ba71SJames Collins 1530ab45ba71SJames Collins if (count($matches) > 1) { 1531ab45ba71SJames Collins $e = explode(' ', $matches[1]); 1532ab45ba71SJames Collins 1533ab45ba71SJames Collins if (count($e) > 1) { 1534ab45ba71SJames Collins foreach ($MIKIO_ICONS as $iconItem) { 15359cff245bSJames Collins if (strcasecmp($iconItem['name'], $e[0]) === 0) { 1536ab45ba71SJames Collins $icon = $iconItem; 1537ab45ba71SJames Collins 1538ab45ba71SJames Collins $s = $icon['insert']; 1539ab45ba71SJames Collins for ($i = 1; $i < 9; $i++) { 15401cdedf28SJames Collins if (count($e) < $i || empty($e[$i]) === true) { 15419cff245bSJames Collins if (isset($icon['$' . $i]) === true) { 1542ab45ba71SJames Collins $s = str_replace('$' . $i, $icon['$' . $i], $s); 1543ab45ba71SJames Collins } 1544ab45ba71SJames Collins } else { 1545ab45ba71SJames Collins $s = str_replace('$' . $i, $e[$i], $s); 1546ab45ba71SJames Collins } 1547ab45ba71SJames Collins } 1548ab45ba71SJames Collins 1549ab45ba71SJames Collins $dir = ''; 15509cff245bSJames Collins if (isset($icon['dir']) === true) { 15519cff245bSJames Collins $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/'; 15529cff245bSJames Collins } 1553ab45ba71SJames Collins 1554ab45ba71SJames Collins $s = str_replace('$0', $dir, $s); 1555ab45ba71SJames Collins 1556ab45ba71SJames Collins break; 15579cff245bSJames Collins }//end if 15589cff245bSJames Collins }//end foreach 1559ab45ba71SJames Collins } else { 1560ab45ba71SJames Collins $s = str_replace('$1', $matches[1], $icon['insert']); 15619cff245bSJames Collins }//end if 15629cff245bSJames Collins }//end if 15639cff245bSJames Collins }//end if 156475adba86SJames Collins 1565ab45ba71SJames Collins $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count); 15669cff245bSJames Collins if ($count === 0) { 1567ab45ba71SJames Collins $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s); 1568ab45ba71SJames Collins } 1569ab45ba71SJames Collins 1570ab45ba71SJames Collins return $s; 1571ab45ba71SJames Collins }, 157210b40067Snomadjimbob $icons[0] 157310b40067Snomadjimbob ); 1574a2005a27SJames Collins }, $content); 1575a2005a27SJames Collins 15763a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 15779cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1578a2005a27SJames Collins $preview[0]->innertext = $content; 1579a2005a27SJames Collins } 1580a2005a27SJames Collins 1581a2005a27SJames Collins $str = $html->save(); 1582a2005a27SJames Collins $html->clear(); 1583a2005a27SJames Collins unset($html); 1584a2005a27SJames Collins } else { 1585a2005a27SJames Collins $str = $content; 1586a2005a27SJames Collins } 15879cff245bSJames Collins }//end if 1588ab45ba71SJames Collins 1589ab45ba71SJames Collins return $str; 1590ab45ba71SJames Collins } 159147161538SJames Collins 1592c165b184SJames Collins /** 1593a8eebd82SJames Collins * Parse HTML for theme 1594c165b184SJames Collins * 15959cff245bSJames Collins * @param string $content HTML content to parse. 1596a8eebd82SJames Collins * @return string Parsed content 1597c165b184SJames Collins */ 15989cff245bSJames Collins public function parseContent(string $content) 159910b40067Snomadjimbob { 1600ab45ba71SJames Collins global $INPUT, $ACT; 1601ab45ba71SJames Collins 1602a8eebd82SJames Collins // Add Mikio Section titles 16033a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 16049cff245bSJames Collins $admin_sections = [ 1605ab45ba71SJames Collins // Section Insert Before Icon 16069cff245bSJames Collins 'navbar' => ['navbarUseTitleIcon', ''], 16079cff245bSJames Collins 'search' => ['searchButton', ''], 16089cff245bSJames Collins 'hero' => ['heroTitle', ''], 16099cff245bSJames Collins 'tags' => ['tagsConsolidate', ''], 16109cff245bSJames Collins 'breadcrumb' => ['breadcrumbHideHome', ''], 16119cff245bSJames Collins 'youarehere' => ['youarehereHideHome', ''], 16129cff245bSJames Collins 'sidebar' => ['sidebarShowLeft', ''], 16139cff245bSJames Collins 'toc' => ['tocFull', ''], 16149cff245bSJames Collins 'pagetools' => ['pageToolsFloating', ''], 16159cff245bSJames Collins 'footer' => ['footerCustomMenuText', ''], 16169cff245bSJames Collins 'license' => ['licenseType', ''], 16179cff245bSJames Collins 'acl' => ['includePageUseACL', ''], 16189cff245bSJames Collins 'sticky' => ['stickyTopHeader', ''], 16199cff245bSJames Collins ]; 1620ab45ba71SJames Collins 1621ab45ba71SJames Collins foreach ($admin_sections as $section => $items) { 1622ab45ba71SJames Collins $search = $items[0]; 1623ab45ba71SJames Collins $icon = $items[1]; 1624ab45ba71SJames Collins 162510b40067Snomadjimbob $content = preg_replace( 1626adf52ebbSJames Collins '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/', 16279cff245bSJames Collins '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) . 16289cff245bSJames Collins tpl_getLang('config_' . $section) . 16299cff245bSJames Collins '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' . 16309cff245bSJames Collins $search . '</span>', 163110b40067Snomadjimbob $content 163210b40067Snomadjimbob ); 1633ab45ba71SJames Collins } 1634bb5a3dd1SJames Collins } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) { 1635*cee81679SJames Collins $style_headers = [ 1636*cee81679SJames Collins ['title' => 'Base', 'starts_with' => '__text'], 1637*cee81679SJames Collins ['title' => 'Code', 'starts_with' => '__code'], 1638*cee81679SJames Collins ['title' => 'Controls', 'starts_with' => '__control'], 1639*cee81679SJames Collins ['title' => 'Header', 'starts_with' => '__topheader'], 1640*cee81679SJames Collins ['title' => 'Navbar', 'starts_with' => '__navbar'], 1641*cee81679SJames Collins ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar'], 1642*cee81679SJames Collins ['title' => 'Tags', 'starts_with' => '__tag_background_color'], 1643*cee81679SJames Collins ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb'], 1644*cee81679SJames Collins ['title' => 'Hero', 'starts_with' => '__hero'], 1645*cee81679SJames Collins ['title' => 'Sidebar', 'starts_with' => '__sidebar'], 1646*cee81679SJames Collins ['title' => 'Content', 'starts_with' => '__content'], 1647*cee81679SJames Collins ['title' => 'TOC', 'starts_with' => '__toc'], 1648*cee81679SJames Collins ['title' => 'Page Tools', 'starts_with' => '__pagetools'], 1649*cee81679SJames Collins ['title' => 'Footer', 'starts_with' => '__footer'], 1650*cee81679SJames Collins ['title' => 'Table', 'starts_with' => '__table'], 1651*cee81679SJames Collins ['title' => 'Dropdown', 'starts_with' => '__dropdown'], 1652*cee81679SJames Collins ['title' => 'Section Edit', 'starts_with' => '__section_edit'], 1653*cee81679SJames Collins ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'], 1654*cee81679SJames Collins ['title' => 'Base', 'starts_with' => '__darkmode_text'], 1655*cee81679SJames Collins ['title' => 'Code', 'starts_with' => '__darkmode_code'], 1656*cee81679SJames Collins ['title' => 'Controls', 'starts_with' => '__darkmode_control'], 1657*cee81679SJames Collins ['title' => 'Header', 'starts_with' => '__darkmode_topheader'], 1658*cee81679SJames Collins ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar'], 1659*cee81679SJames Collins ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar'], 1660*cee81679SJames Collins ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color'], 1661*cee81679SJames Collins ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb'], 1662*cee81679SJames Collins ['title' => 'Hero', 'starts_with' => '__darkmode_hero'], 1663*cee81679SJames Collins ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar'], 1664*cee81679SJames Collins ['title' => 'Content', 'starts_with' => '__darkmode_content'], 1665*cee81679SJames Collins ['title' => 'TOC', 'starts_with' => '__darkmode_toc'], 1666*cee81679SJames Collins ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools'], 1667*cee81679SJames Collins ['title' => 'Footer', 'starts_with' => '__darkmode_footer'], 1668*cee81679SJames Collins ['title' => 'Table', 'starts_with' => '__darkmode_table'], 1669*cee81679SJames Collins ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown'], 1670*cee81679SJames Collins ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit'], 1671*cee81679SJames Collins ]; 1672*cee81679SJames Collins 1673*cee81679SJames Collins foreach($style_headers as $header) { 1674*cee81679SJames Collins if(array_key_exists('heading', $header) === false) { 1675*cee81679SJames Collins $header['heading'] = 'h3'; 1676*cee81679SJames Collins } 1677*cee81679SJames Collins 16781244e3ceSJames Collins $content = preg_replace( 1679*cee81679SJames Collins '/(<tr>\s*<td>\s*<label for="tpl__'.$header['starts_with'].'.*?<\/tr>)/', 1680*cee81679SJames Collins '</tbody></table><'.$header['heading'].'>'.$header['title'].'</'.$header['heading'].'><table><tbody>$1', 16811244e3ceSJames Collins $content, 16821244e3ceSJames Collins 1 16831244e3ceSJames Collins ); 1684*cee81679SJames Collins } 1685bb5a3dd1SJames Collins }//end if 1686ab45ba71SJames Collins 16873a385f2cSJames Collins if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) { 1688a8eebd82SJames Collins $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content); 1689a8eebd82SJames Collins } 1690ab45ba71SJames Collins 1691a8eebd82SJames Collins // Page Revisions - Table Fix 16929cff245bSJames Collins if (strpos($content, 'id="page__revisions"') !== false) { 16939cff245bSJames Collins $content = preg_replace( 16949cff245bSJames Collins '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/', 16959cff245bSJames Collins '<span>$1</span>', 16969cff245bSJames Collins $content 16979cff245bSJames Collins ); 1698a8eebd82SJames Collins } 1699ab45ba71SJames Collins 17009cff245bSJames Collins $html = new \simple_html_dom(); 1701bc1032d9SJames Collins $html->stripRNAttrValues = false; 1702c165b184SJames Collins $html->load($content, true, false); 1703c165b184SJames Collins 17049cff245bSJames Collins if ($html === false) { 17059cff245bSJames Collins return $content; 17069cff245bSJames Collins } 1707ab45ba71SJames Collins 1708ab45ba71SJames Collins /* Buttons */ 1709ab45ba71SJames Collins foreach ($html->find('#config__manager button') as $node) { 1710ab45ba71SJames Collins $c = explode(' ', $node->class); 17119cff245bSJames Collins if (in_array('mikio-button', $c) === false) { 17129cff245bSJames Collins $c[] = 'mikio-button'; 17139cff245bSJames Collins } 1714ab45ba71SJames Collins $node->class = implode(' ', $c); 1715c165b184SJames Collins } 1716c165b184SJames Collins 1717ab45ba71SJames Collins 1718ab45ba71SJames Collins /* Buttons - Primary */ 1719ab45ba71SJames Collins foreach ($html->find('#config__manager [type=submit]') as $node) { 1720ab45ba71SJames Collins $c = explode(' ', $node->class); 17219cff245bSJames Collins if (in_array('mikio-primary', $c) === false) { 17229cff245bSJames Collins $c[] = 'mikio-primary'; 17239cff245bSJames Collins } 1724ab45ba71SJames Collins $node->class = implode(' ', $c); 1725ab45ba71SJames Collins } 1726ab45ba71SJames Collins 1727a8eebd82SJames Collins /* Hide page title if hero is enabled */ 17289cff245bSJames Collins if ($this->getConf('heroTitle') === true && $ACT !== 'preview') { 17291785fc73SJames Collins $pageTitle = $this->parsePageTitle(); 173047161538SJames Collins 173147161538SJames Collins foreach ($html->find('h1,h2,h3,h4') as $elm) { 17329cff245bSJames Collins if ($elm->innertext === $pageTitle) { 1733a8eebd82SJames Collins // $elm->innertext = ''; 1734a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1735a8eebd82SJames Collins 173647161538SJames Collins break; 173747161538SJames Collins } 173847161538SJames Collins } 173947161538SJames Collins } 1740c165b184SJames Collins 1741a8eebd82SJames Collins /* Hero subtitle */ 17422b4583abSJames Collins foreach ($html->find('p') as $elm) { 17432b4583abSJames Collins $i = stripos($elm->innertext, '~~hero-subtitle'); 17442b4583abSJames Collins if ($i !== false) { 17459cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 17462b4583abSJames Collins if ($j !== false) { 17479cff245bSJames Collins if ($j > ($i + 16)) { 17489cff245bSJames Collins $subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16)); 1749a8eebd82SJames Collins $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')'; 1750a8eebd82SJames Collins 1751a8eebd82SJames Collins // $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2); 1752a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext); 17532b4583abSJames Collins } 17542b4583abSJames Collins 17552b4583abSJames Collins break; 17562b4583abSJames Collins } 17572b4583abSJames Collins } 17582b4583abSJames Collins } 17592b4583abSJames Collins 1760a8eebd82SJames Collins /* Hero image */ 1761a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1762a8eebd82SJames Collins $image = ''; 1763a8eebd82SJames Collins preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches); 1764a8eebd82SJames Collins if (count($matches) > 0) { 1765a8eebd82SJames Collins preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches); 1766a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1767a8eebd82SJames Collins $image = $imageTagMatches[1]; 1768a8eebd82SJames Collins } else { 1769a8eebd82SJames Collins preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches); 1770a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1771a8eebd82SJames Collins $image = $imageTagMatches[1]; 1772a8eebd82SJames Collins } else { 1773a8eebd82SJames Collins $image = strip_tags($matches[1]); 17749cff245bSJames Collins if (stripos($image, ':') === false) { 17759cff245bSJames Collins $image = str_replace(['{', '}'], '', $image); 1776a8eebd82SJames Collins $i = stripos($image, '?'); 17779cff245bSJames Collins if ($i !== false) { 1778a8eebd82SJames Collins $image = substr($image, 0, $i); 1779c165b184SJames Collins } 1780c165b184SJames Collins 1781a8eebd82SJames Collins $image = ml($image, '', true, '', false); 1782ab45ba71SJames Collins } 1783ab45ba71SJames Collins } 1784ab45ba71SJames Collins } 1785ab45ba71SJames Collins 1786a8eebd82SJames Collins $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')'; 1787a8eebd82SJames Collins 1788a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext); 17899cff245bSJames Collins }//end if 17909cff245bSJames Collins }//end foreach 1791ab45ba71SJames Collins 17929cff245bSJames Collins /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color] 17939cff245bSJames Collins [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */ 1794a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1795a8eebd82SJames Collins $i = stripos($elm->innertext, '~~hero-colors'); 1796a8eebd82SJames Collins if ($i !== false) { 17979cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 1798a8eebd82SJames Collins if ($j !== false) { 17999cff245bSJames Collins if ($j > ($i + 14)) { 18009cff245bSJames Collins $color = substr($elm->innertext, ($i + 14), ($j - $i - 14)); 1801a8eebd82SJames Collins $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')'; 1802ab45ba71SJames Collins 1803a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext); 1804ab45ba71SJames Collins } 1805ab45ba71SJames Collins 1806a8eebd82SJames Collins break; 1807ab45ba71SJames Collins } 1808ab45ba71SJames Collins } 1809ab45ba71SJames Collins } 1810ab45ba71SJames Collins 181196ec8e1eSJames Collins /* Hide parts - ~~hide-parts [parts]~~ */ 181296ec8e1eSJames Collins foreach ($html->find('p') as $elm) { 181396ec8e1eSJames Collins $i = stripos($elm->innertext, '~~hide-parts'); 181496ec8e1eSJames Collins if ($i !== false) { 18159cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 181696ec8e1eSJames Collins if ($j !== false) { 18179cff245bSJames Collins if ($j > ($i + 13)) { 18189cff245bSJames Collins $parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13))); 181996ec8e1eSJames Collins $script = ''; 182096ec8e1eSJames Collins 182196ec8e1eSJames Collins foreach ($parts as $part) { 182296ec8e1eSJames Collins // $part = trim($part); 182396ec8e1eSJames Collins if (strlen($part) > 0) { 182496ec8e1eSJames Collins $script .= 'mikio.hidePart(\'' . $part . '\');'; 182596ec8e1eSJames Collins } 182696ec8e1eSJames Collins } 182796ec8e1eSJames Collins 182896ec8e1eSJames Collins if (strlen($script) > 0) { 182996ec8e1eSJames Collins $this->footerScript['hide-parts'] = $script; 183096ec8e1eSJames Collins } 183196ec8e1eSJames Collins 183296ec8e1eSJames Collins $elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext); 183396ec8e1eSJames Collins } 183496ec8e1eSJames Collins 183596ec8e1eSJames Collins break; 18369cff245bSJames Collins }//end if 18379cff245bSJames Collins }//end if 18389cff245bSJames Collins }//end foreach 183996ec8e1eSJames Collins 184096ec8e1eSJames Collins 1841a8eebd82SJames Collins /* Page Tags (tag plugin) */ 18429cff245bSJames Collins if ($this->getConf('tagsConsolidate') === true) { 1843a8eebd82SJames Collins $tags = ''; 1844a8eebd82SJames Collins foreach ($html->find('div.tags a') as $elm) { 1845a8eebd82SJames Collins $tags .= $elm->outertext; 1846a8eebd82SJames Collins } 1847a8eebd82SJames Collins 1848a8eebd82SJames Collins foreach ($html->find('div.tags') as $elm) { 1849a8eebd82SJames Collins $elm->innertext = ''; 1850a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1851a8eebd82SJames Collins } 1852a8eebd82SJames Collins 18533a385f2cSJames Collins if (empty($tags) === false) { 1854a8eebd82SJames Collins $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')'; 1855a8eebd82SJames Collins } 1856ab45ba71SJames Collins } 1857ab45ba71SJames Collins 1858ab45ba71SJames Collins // Configuration Manager 18593a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 1860ab45ba71SJames Collins // Additional save buttons 1861ab45ba71SJames Collins foreach ($html->find('#config__manager') as $cm) { 1862ab45ba71SJames Collins $saveButtons = ''; 1863ab45ba71SJames Collins 1864ab45ba71SJames Collins foreach ($cm->find('p') as $elm) { 1865ab45ba71SJames Collins $saveButtons = $elm->outertext; 1866a8eebd82SJames Collins $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons); 1867ab45ba71SJames Collins $elm->outertext = ''; 1868ab45ba71SJames Collins } 1869ab45ba71SJames Collins 1870ab45ba71SJames Collins foreach ($cm->find('fieldset') as $elm) { 1871ab45ba71SJames Collins $elm->innertext .= $saveButtons; 1872ab45ba71SJames Collins } 1873ab45ba71SJames Collins } 1874ab45ba71SJames Collins } 1875ab45ba71SJames Collins 1876ab45ba71SJames Collins $content = $html->save(); 1877c165b184SJames Collins $html->clear(); 1878c165b184SJames Collins unset($html); 1879c165b184SJames Collins 1880c165b184SJames Collins return $content; 1881c165b184SJames Collins } 18822b4583abSJames Collins 18832b4583abSJames Collins 1884a8eebd82SJames Collins /** 1885a8eebd82SJames Collins * Get DokuWiki namespace/page/URI as link 1886a8eebd82SJames Collins * 18879cff245bSJames Collins * @param string $str String to parse. 18889cff245bSJames Collins * @return string parsed URI 1889a8eebd82SJames Collins */ 18909cff245bSJames Collins public function getLink(string $str) 189110b40067Snomadjimbob { 18922b4583abSJames Collins $i = strpos($str, '://'); 18939cff245bSJames Collins if ($i !== false) { 18949cff245bSJames Collins return $str; 18959cff245bSJames Collins } 18962b4583abSJames Collins 18972b4583abSJames Collins return wl($str); 18982b4583abSJames Collins } 1899ab45ba71SJames Collins 1900ab45ba71SJames Collins 1901a8eebd82SJames Collins /** 1902a8eebd82SJames Collins * Check if the user can edit current namespace/page 1903a8eebd82SJames Collins * 1904a8eebd82SJames Collins * @return boolean user can edit 1905a8eebd82SJames Collins */ 190610b40067Snomadjimbob public function userCanEdit() 190710b40067Snomadjimbob { 1908ab45ba71SJames Collins global $INFO; 1909ab45ba71SJames Collins global $ID; 1910ab45ba71SJames Collins 1911ab45ba71SJames Collins $wiki_file = wikiFN($ID); 19129cff245bSJames Collins if (@file_exists($wiki_file) === false) { 19139cff245bSJames Collins return true; 19149cff245bSJames Collins } 19159cff245bSJames Collins if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) { 19169cff245bSJames Collins return true; 19179cff245bSJames Collins } 1918a8eebd82SJames Collins // $meta_file = metaFN($ID, '.meta'); 19199cff245bSJames Collins if ($INFO['meta']['user'] === false) { 19209cff245bSJames Collins return true; 19219cff245bSJames Collins } 19229cff245bSJames Collins if ($INFO['client'] === $INFO['meta']['user']) { 19239cff245bSJames Collins return true; 19249cff245bSJames Collins } 1925ab45ba71SJames Collins 1926ab45ba71SJames Collins return false; 1927c165b184SJames Collins } 192847161538SJames Collins 192947161538SJames Collins 1930a8eebd82SJames Collins /** 1931a8eebd82SJames Collins * Search for and return the uri of a media file 1932a8eebd82SJames Collins * 19339cff245bSJames Collins * @param string $image Image name to search for (without extension). 19349cff245bSJames Collins * @param boolean $searchCurrentNS Search the current namespace. 19359cff245bSJames Collins * @param boolean $propagate Propagate search through the namespace. 19369cff245bSJames Collins * @return string URI of the found media file 1937a8eebd82SJames Collins */ 19389cff245bSJames Collins public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true) 193910b40067Snomadjimbob { 1940ab45ba71SJames Collins global $INFO; 1941a8eebd82SJames Collins 19429cff245bSJames Collins $ext = ['png', 'jpg', 'gif', 'svg']; 1943ab45ba71SJames Collins 19449cff245bSJames Collins if ($searchCurrentNS === true) { 19459cff245bSJames Collins $prefix[] = ':' . $INFO['namespace'] . ':'; 19469cff245bSJames Collins } 19479cff245bSJames Collins if ($propagate === true) { 1948ab45ba71SJames Collins $prefix[] = ':'; 1949ab45ba71SJames Collins $prefix[] = ':wiki:'; 1950a8eebd82SJames Collins } 1951ab45ba71SJames Collins $theme = $this->getConf('customTheme'); 19523a385f2cSJames Collins if (empty($theme) === false) { 19539cff245bSJames Collins $prefix[] = 'themes/' . $theme . '/images/'; 19549cff245bSJames Collins } 1955ab45ba71SJames Collins $prefix[] = 'images/'; 1956ab45ba71SJames Collins 19579cff245bSJames Collins $search = []; 1958ab45ba71SJames Collins foreach ($prefix as $pitem) { 1959ab45ba71SJames Collins foreach ($ext as $eitem) { 1960ab45ba71SJames Collins $search[] = $pitem . $image . '.' . $eitem; 1961ab45ba71SJames Collins } 1962ab45ba71SJames Collins } 1963ab45ba71SJames Collins 1964ab45ba71SJames Collins $img = ''; 1965ab45ba71SJames Collins $file = ''; 1966ab45ba71SJames Collins $url = ''; 1967ab45ba71SJames Collins $ismedia = false; 1968ab45ba71SJames Collins $found = false; 1969ab45ba71SJames Collins 1970ab45ba71SJames Collins foreach ($search as $img) { 19713a385f2cSJames Collins if (strcasecmp(substr($img, 0, 1), ':') === 0) { 1972ab45ba71SJames Collins $file = mediaFN($img); 1973ab45ba71SJames Collins $ismedia = true; 1974ab45ba71SJames Collins } else { 1975ab45ba71SJames Collins $file = tpl_incdir() . $img; 1976ab45ba71SJames Collins $ismedia = false; 1977ab45ba71SJames Collins } 1978ab45ba71SJames Collins 19799cff245bSJames Collins if (file_exists($file) === true) { 1980ab45ba71SJames Collins $found = true; 1981ab45ba71SJames Collins break; 1982ab45ba71SJames Collins } 1983ab45ba71SJames Collins } 1984ab45ba71SJames Collins 19859cff245bSJames Collins if ($found === false) { 19869cff245bSJames Collins return false; 19879cff245bSJames Collins } 1988ab45ba71SJames Collins 19899cff245bSJames Collins if ($ismedia === true) { 1990ab45ba71SJames Collins $url = ml($img, '', true, '', false); 1991ab45ba71SJames Collins } else { 1992ab45ba71SJames Collins $url = tpl_basedir() . $img; 1993ab45ba71SJames Collins } 1994ab45ba71SJames Collins 1995ab45ba71SJames Collins return $url; 1996ab45ba71SJames Collins } 1997ab45ba71SJames Collins 1998a8eebd82SJames Collins 1999a8eebd82SJames Collins /** 2000ab45ba71SJames Collins * Print or return the page title 2001ab45ba71SJames Collins * 20029cff245bSJames Collins * @param string $page Page id or empty string for current page. 2003ab45ba71SJames Collins * @return string generated content 2004ab45ba71SJames Collins */ 20059cff245bSJames Collins public function getPageTitle(string $page = '') 200610b40067Snomadjimbob { 2007ab45ba71SJames Collins global $ID, $conf; 2008ab45ba71SJames Collins 2009ab45ba71SJames Collins $html = ''; 2010ab45ba71SJames Collins 20113a385f2cSJames Collins if (empty($page) === true) { 20129cff245bSJames Collins $page = $ID; 20139cff245bSJames Collins } 2014ab45ba71SJames Collins 2015ab45ba71SJames Collins $html = p_get_first_heading($page); 2016ab45ba71SJames Collins $html = strip_tags($html); 2017ab45ba71SJames Collins $html = preg_replace('/\s+/', ' ', $html); 2018ab45ba71SJames Collins $html .= ' [' . strip_tags($conf['title']) . ']'; 2019ab45ba71SJames Collins $html = trim($html); 2020ab45ba71SJames Collins 2021ab45ba71SJames Collins return $html; 2022ab45ba71SJames Collins } 2023a8eebd82SJames Collins 2024a8eebd82SJames Collins 2025a8eebd82SJames Collins /** 2026a8eebd82SJames Collins * Return inline theme icon 2027a8eebd82SJames Collins * 20289cff245bSJames Collins * @param string $type Icon to retreive. 20299e41d878SJames Collins * @param string $class Classname to insert. 20309cff245bSJames Collins * @return string HTML icon content 2031a8eebd82SJames Collins */ 20329e41d878SJames Collins public function mikioInlineIcon(string $type, string $class="") 203310b40067Snomadjimbob { 20349e41d878SJames Collins if(is_array($class) === true) { 20359e41d878SJames Collins $class = explode(' ', $class); 20369e41d878SJames Collins } 20379e41d878SJames Collins 20389e41d878SJames Collins if(strlen($class) > 0) { 20399e41d878SJames Collins $class = ' ' . $class; 20409e41d878SJames Collins } 20419e41d878SJames Collins 2042a8eebd82SJames Collins switch ($type) { 2043a8eebd82SJames Collins case 'wrench': 20449e41d878SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 20459cff245bSJames 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 20469cff245bSJames 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 20479cff245bSJames 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 20489cff245bSJames 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, 20499cff245bSJames 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, 20509cff245bSJames 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>'; 2051a8eebd82SJames Collins case 'file': 20529e41d878SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 20539cff245bSJames 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 20549cff245bSJames 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, 20559cff245bSJames 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 20569cff245bSJames Collinsl 408,-408 q 28,-28 48,-76 20,-48 20,-88 z" id="path2993" inkscape:connector-curvature="0" 20579cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 2058a8eebd82SJames Collins case 'gear': 20599e41d878SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 20609cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027"><path d="m 1024,640 q 0,106 20619cff245bSJames 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 20629cff245bSJames 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, 20639cff245bSJames 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 20649cff245bSJames 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 20659cff245bSJames 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, 20669cff245bSJames 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 20679cff245bSJames 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 20689cff245bSJames 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 20699cff245bSJames 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>'; 2070a8eebd82SJames Collins case 'user': 20719e41d878SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 20729cff245bSJames 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 20739cff245bSJames 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 20749cff245bSJames 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 20759cff245bSJames 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 20769cff245bSJames 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 20779cff245bSJames 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 20789cff245bSJames Collins1088,1024 z"/></g></svg>'; 2079a8eebd82SJames Collins case 'search': 20809e41d878SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" 20819cff245bSJames 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 20829cff245bSJames 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 20839cff245bSJames 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 20849cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>'; 2085a8eebd82SJames Collins case 'home': 20869e41d878SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 20879cff245bSJames Collinsaria-hidden="true" style="fill:currentColor"><g transform="matrix(1,0,0,-1,68.338983,1285.4237)" id="g3015"> 20889cff245bSJames 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, 20899cff245bSJames 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, 20909cff245bSJames 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, 20919cff245bSJames 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, 20929cff245bSJames Collins-182 q 10,-8 11,-21.5 1,-13.5 -7,-23.5 z" id="path3017" inkscape:connector-curvature="0" 20939cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 20949e41d878SJames Collins case 'sun': 20959e41d878SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" style="fill:currentColor" viewBox="0 0 16 16"><path d="M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm.5-9.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm0 11a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm5-5a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-11 0a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm9.743-4.036a.5.5 0 1 1-.707-.707.5.5 0 0 1 .707.707zm-7.779 7.779a.5.5 0 1 1-.707-.707.5.5 0 0 1 .707.707zm7.072 0a.5.5 0 1 1 .707-.707.5.5 0 0 1-.707.707zM3.757 4.464a.5.5 0 1 1 .707-.707.5.5 0 0 1-.707.707z" /></svg>'; 20969e41d878SJames Collins case 'moon': 20979e41d878SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" style="fill:currentColor" viewBox="0 0 16 16"><path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278zM4.858 1.311A7.269 7.269 0 0 0 1.025 7.71c0 4.02 3.279 7.276 7.319 7.276a7.316 7.316 0 0 0 5.205-2.162c-.337.042-.68.063-1.029.063-4.61 0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>'; 20989cff245bSJames Collins }//end switch 2099ab45ba71SJames Collins 2100a8eebd82SJames Collins return ''; 2101a8eebd82SJames Collins } 2102ab45ba71SJames Collins 2103a8eebd82SJames Collins /** 2104a8eebd82SJames Collins * Finalize theme 21059cff245bSJames Collins * 21069cff245bSJames Collins * @return void 2107a8eebd82SJames Collins */ 210810b40067Snomadjimbob public function finalize() 210910b40067Snomadjimbob { 2110a8eebd82SJames Collins } 21111785fc73SJames Collins 21121785fc73SJames Collins /** 21131785fc73SJames Collins * Show Messages 21149cff245bSJames Collins * 21159cff245bSJames Collins * @return void 21161785fc73SJames Collins */ 211710b40067Snomadjimbob public function showMessages() 211810b40067Snomadjimbob { 21191785fc73SJames Collins global $ACT; 21201785fc73SJames Collins 21219cff245bSJames Collins if ($this->lessIgnored === true) { 21229cff245bSJames Collins msg( 21239cff245bSJames Collins 'useLESS is enabled on the Mikio template, however is not supported on this server', 21249cff245bSJames Collins 2, 21259cff245bSJames Collins '', 21269cff245bSJames Collins '', 21279cff245bSJames Collins MSG_ADMINS_ONLY 21289cff245bSJames Collins ); 2129a8df40efSJames Collins } 2130a8df40efSJames Collins 21311785fc73SJames Collins $show = $this->getConf('showNotifications'); 21323a385f2cSJames Collins if ( 21333a385f2cSJames Collins strcasecmp($show, 'always') === 0 || 21343a385f2cSJames Collins (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0) 21353a385f2cSJames Collins ) { 21361785fc73SJames Collins global $MSG, $MSG_shown; 21371785fc73SJames Collins 21389cff245bSJames Collins if (isset($MSG) === false) { 21391785fc73SJames Collins return; 21401785fc73SJames Collins } 21411785fc73SJames Collins 21429cff245bSJames Collins if (isset($MSG_shown) === false) { 21439cff245bSJames Collins $MSG_shown = []; 2144a8df40efSJames Collins } 21451785fc73SJames Collins 21461785fc73SJames Collins foreach ($MSG as $msg) { 21471785fc73SJames Collins $hash = md5($msg['msg']); 21489cff245bSJames Collins if (isset($MSG_shown[$hash]) === true) { 21491785fc73SJames Collins continue; 21501785fc73SJames Collins } 21511785fc73SJames Collins // skip double messages 21521785fc73SJames Collins 21539cff245bSJames Collins if (info_msg_allowed($msg) === true) { 21549cff245bSJames Collins echo '<div class="' . $msg['lvl'] . '">'; 21559cff245bSJames Collins echo $msg['msg']; 21569cff245bSJames Collins echo '</div>'; 21571785fc73SJames Collins } 21581785fc73SJames Collins 2159a8df40efSJames Collins $MSG_shown[$hash] = true; 21601785fc73SJames Collins } 21611785fc73SJames Collins 21621785fc73SJames Collins unset($GLOBALS['MSG']); 21639cff245bSJames Collins }//end if 21641785fc73SJames Collins } 21657ac0a6efSJames Collins 21667ac0a6efSJames Collins /** 21677ac0a6efSJames Collins * Dokuwiki version 21687ac0a6efSJames Collins * 21697ac0a6efSJames Collins * @return string the dw version name 21707ac0a6efSJames Collins */ 21719cff245bSJames Collins public function dwVersion() 21729cff245bSJames Collins { 21739cff245bSJames Collins if (function_exists('getVersionData') === true) { 21747ac0a6efSJames Collins $version_data = getVersionData(); 21759cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 21767ac0a6efSJames Collins $version_items = explode(' ', $version_data['date']); 21777ac0a6efSJames Collins if (count($version_items) >= 2) { 21787ac0a6efSJames Collins return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1])); 21797ac0a6efSJames Collins } 21807ac0a6efSJames Collins } 21817ac0a6efSJames Collins } 21827ac0a6efSJames Collins 21837ac0a6efSJames Collins return 'unknown'; 21847ac0a6efSJames Collins } 2185e4c4fb13SJames Collins 2186e4c4fb13SJames Collins /** 2187e4c4fb13SJames Collins * Dokuwiki version number 2188e4c4fb13SJames Collins * 2189e4c4fb13SJames Collins * @return string the dw version date converted to integer 2190e4c4fb13SJames Collins */ 21919cff245bSJames Collins public function dwVersionNumber() 21929cff245bSJames Collins { 21939cff245bSJames Collins if (function_exists('getVersionData') === true) { 2194e4c4fb13SJames Collins $version_data = getVersionData(); 21959cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 2196e4c4fb13SJames Collins $version_items = explode(' ', $version_data['date']); 2197e4c4fb13SJames Collins if (count($version_items) >= 1) { 2198e4c4fb13SJames Collins return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0]))); 2199e4c4fb13SJames Collins } 2200e4c4fb13SJames Collins } 2201e4c4fb13SJames Collins } 2202e4c4fb13SJames Collins 2203e4c4fb13SJames Collins return 0; 2204e4c4fb13SJames Collins } 2205a8eebd82SJames Collins} 2206ab45ba71SJames Collins 2207ab45ba71SJames Collinsglobal $TEMPLATE; 220847161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance(); 2209