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 220*95372bffSJames Collins 221*95372bffSJames Collins // phpcs:disable Squiz.Commenting.FunctionComment.TypeHintMissing 222*95372bffSJames Collins 223*95372bffSJames 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 */ 231*95372bffSJames 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'], 3213a385f2cSJames Collins ['keys' => ['youarehereShowLast'], 'type' => 'int'], 3223a385f2cSJames Collins 3233a385f2cSJames Collins ['keys' => ['iconTag'], 'type' => 'string'], 3243a385f2cSJames Collins ['keys' => ['customTheme'], 'type' => 'string'], 3253a385f2cSJames Collins ['keys' => ['navbarCustomMenuText'], 'type' => 'string'], 3263a385f2cSJames Collins ['keys' => ['breadcrumbPrefixText'], 'type' => 'string'], 3273a385f2cSJames Collins ['keys' => ['breadcrumbSepText'], 'type' => 'string'], 3283a385f2cSJames Collins ['keys' => ['youareherePrefixText'], 'type' => 'string'], 3293a385f2cSJames Collins ['keys' => ['youarehereSepText'], 'type' => 'string'], 3303a385f2cSJames Collins ['keys' => ['footerCustomMenuText'], 'type' => 'string'], 3313a385f2cSJames Collins ['keys' => ['brandURLGuest'], 'type' => 'string'], 3323a385f2cSJames Collins ['keys' => ['brandURLUser'], 'type' => 'string'], 3333a385f2cSJames Collins 3343a385f2cSJames Collins ['keys' => ['useLESS'], 'type' => 'less'], 3353a385f2cSJames Collins ]; 3363a385f2cSJames Collins 3373a385f2cSJames Collins foreach ($data as $row) { 3383a385f2cSJames Collins // does not check case.... 3393a385f2cSJames Collins if (in_array($key, $row['keys']) === true) { 340*95372bffSJames Collins if (array_key_exists('type', $row) === true) { 3413a385f2cSJames Collins switch ($row['type']) { 3423a385f2cSJames Collins case 'bool': 3433a385f2cSJames Collins return (bool) $value; 3443a385f2cSJames Collins case 'int': 3453a385f2cSJames Collins return (int) $value; 3463a385f2cSJames Collins case 'string': 3473a385f2cSJames Collins return $value; 3483a385f2cSJames Collins case 'less': 34929118ed7SJames Collins $value = (bool) $value; 350a8df40efSJames Collins $lessAvailable = true; 351a8df40efSJames Collins 352a8df40efSJames Collins // check for less library 353a8df40efSJames Collins $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3549cff245bSJames Collins if (file_exists($lesscLib) === false) { 355a8df40efSJames Collins $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3569cff245bSJames Collins } 3579cff245bSJames Collins if (file_exists($lesscLib) === false) { 358a8df40efSJames Collins $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3599cff245bSJames Collins } 3609cff245bSJames Collins if (file_exists($lesscLib) === false) { 3619cff245bSJames Collins $lesscLib = $_SERVER['DOCUMENT_ROOT'] . 3629cff245bSJames Collins '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3639cff245bSJames Collins } 3649cff245bSJames Collins if (file_exists($lesscLib) === false) { 365a8df40efSJames Collins $lessAvailable = false; 366a8df40efSJames Collins } 367a8df40efSJames Collins 368a8df40efSJames Collins // check for ctype extensions 3699cff245bSJames Collins if (function_exists('ctype_digit') === false) { 370a8df40efSJames Collins $lessAvailable = false; 371a8df40efSJames Collins } 372a8df40efSJames Collins 3739cff245bSJames Collins if ($value === true && $lessAvailable === false) { 374a8df40efSJames Collins $this->lessIgnored = true; 37529118ed7SJames Collins $value = false; 37629118ed7SJames Collins } 3773a385f2cSJames Collins 3783a385f2cSJames Collins return $value; 3799cff245bSJames Collins }//end switch 3803a385f2cSJames Collins }//end if 3813a385f2cSJames Collins 3823a385f2cSJames Collins if (in_array($value, $row['values']) === true) { 3833a385f2cSJames Collins return $value; 3843a385f2cSJames Collins } 3853a385f2cSJames Collins 3863a385f2cSJames Collins if (array_key_exists('default', $row) === true) { 3873a385f2cSJames Collins if (is_array($row['default']) === true) { 3883a385f2cSJames Collins if (array_key_exists($key, $row['default']) === true) { 3893a385f2cSJames Collins return $row['default'][$key]; 3903a385f2cSJames Collins } 3913a385f2cSJames Collins } else { 3923a385f2cSJames Collins return $row['default']; 3933a385f2cSJames Collins } 3943a385f2cSJames Collins } 3953a385f2cSJames Collins 3963a385f2cSJames Collins return reset($row['values']); 3973a385f2cSJames Collins }//end if 3983a385f2cSJames Collins }//end foreach 399c165b184SJames Collins 400c165b184SJames Collins return $value; 401c165b184SJames Collins } 402c165b184SJames Collins 403c165b184SJames Collins 404*95372bffSJames Collins // phpcs:enable 405*95372bffSJames Collins 406*95372bffSJames Collins 407c165b184SJames Collins /** 408a8eebd82SJames Collins * Check if a page exist in directory or namespace 409c165b184SJames Collins * 4109cff245bSJames Collins * @param string $page Page/namespace to search. 411a8eebd82SJames Collins * @return boolean if page exists 412c165b184SJames Collins */ 4139cff245bSJames Collins public function pageExists(string $page) 41410b40067Snomadjimbob { 415ab45ba71SJames Collins ob_start(); 416a8eebd82SJames Collins tpl_includeFile($page . '.html'); 417ab45ba71SJames Collins $html = ob_get_contents(); 418ab45ba71SJames Collins ob_end_clean(); 419a8eebd82SJames Collins 4203a385f2cSJames Collins if (empty($html) === false) { 4219cff245bSJames Collins return true; 4229cff245bSJames Collins } 423a8eebd82SJames Collins 424a8eebd82SJames Collins $useACL = $this->getConf('includePageUseACL'); 425a8eebd82SJames Collins $propagate = $this->getConf('includePagePropagate'); 426a8eebd82SJames Collins 4279cff245bSJames Collins if ($propagate === true) { 4289cff245bSJames Collins if (page_findnearest($page, $useACL) !== false) { 4299cff245bSJames Collins return true; 4309cff245bSJames Collins } 4319cff245bSJames Collins } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) { 4329cff245bSJames Collins return true; 433ab45ba71SJames Collins } 434ab45ba71SJames Collins 4359cff245bSJames Collins return false; 436ab45ba71SJames Collins } 437ab45ba71SJames Collins 438a8eebd82SJames Collins 439c165b184SJames Collins /** 440a8eebd82SJames Collins * Print or return page from directory or namespace 4412b4583abSJames Collins * 4429cff245bSJames Collins * @param string $page Page/namespace to include. 4439cff245bSJames Collins * @param boolean $print Print content. 4449cff245bSJames Collins * @param boolean $parse Parse content before printing/returning. 4459cff245bSJames Collins * @param string $classWrapper Wrap page in a div with class. 446ab45ba71SJames Collins * @return string contents of page found 4472b4583abSJames Collins */ 4489cff245bSJames Collins public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '') 4492b4583abSJames Collins { 450a8eebd82SJames Collins ob_start(); 451a8eebd82SJames Collins tpl_includeFile($page . '.html'); 452a8eebd82SJames Collins $html = ob_get_contents(); 453a8eebd82SJames Collins ob_end_clean(); 454a8eebd82SJames Collins 4553a385f2cSJames Collins if (empty($html) === true) { 456a8eebd82SJames Collins $useACL = $this->getConf('includePageUseACL'); 457a8eebd82SJames Collins $propagate = $this->getConf('includePagePropagate'); 458ab45ba71SJames Collins $html = ''; 4592b4583abSJames Collins 460ab45ba71SJames Collins $html = tpl_include_page($page, false, $propagate, $useACL); 461ab45ba71SJames Collins } 4622b4583abSJames Collins 4633a385f2cSJames Collins if (empty($html) === false && $parse === true) { 464ab45ba71SJames Collins $html = $this->parseContent($html); 465ab45ba71SJames Collins } 4662b4583abSJames Collins 4673a385f2cSJames Collins if (empty($classWrapper) === false && empty($html) === false) { 4689cff245bSJames Collins $html = '<div class="' . $classWrapper . '">' . $html . '</div>'; 4699cff245bSJames Collins } 4702b4583abSJames Collins 4719cff245bSJames Collins if ($print === true) { 4729cff245bSJames Collins echo $html; 4739cff245bSJames Collins } 474ab45ba71SJames Collins return $html; 4752b4583abSJames Collins } 4762b4583abSJames Collins 477a8eebd82SJames Collins 478a8eebd82SJames Collins /** 479a8eebd82SJames Collins * Print or return logged in user information 480a8eebd82SJames Collins * 4819cff245bSJames Collins * @param boolean $print Print content. 482a8eebd82SJames Collins * @return string user information 483a8eebd82SJames Collins */ 4849cff245bSJames Collins public function includeLoggedIn(bool $print = true) 48510b40067Snomadjimbob { 486a8eebd82SJames Collins $html = ''; 487a8eebd82SJames Collins 4889cff245bSJames Collins if (empty($_SERVER['REMOTE_USER']) === false) { 489a8eebd82SJames Collins $html .= '<div class="mikio-user-info">'; 490a8eebd82SJames Collins ob_start(); 491a8eebd82SJames Collins tpl_userinfo(); 492a8eebd82SJames Collins $html .= ob_get_contents(); 493a8eebd82SJames Collins ob_end_clean(); 494a8eebd82SJames Collins $html .= '</div>'; 4952b4583abSJames Collins } 496a8eebd82SJames Collins 4979cff245bSJames Collins if ($print === true) { 4989cff245bSJames Collins echo $html; 4999cff245bSJames Collins } 500a8eebd82SJames Collins return $html; 5012b4583abSJames Collins } 5022b4583abSJames Collins 5032b4583abSJames Collins 504a8eebd82SJames Collins /** 505a8eebd82SJames Collins * Print or return DokuWiki Menu 506a8eebd82SJames Collins * 5079cff245bSJames Collins * @param boolean $print Print content. 508a8eebd82SJames Collins * @return string contents of the menu 509a8eebd82SJames Collins */ 5109cff245bSJames Collins public function includeDWMenu(bool $print = true) 51110b40067Snomadjimbob { 5122b4583abSJames Collins global $lang; 5132b4583abSJames Collins global $USERINFO; 514c165b184SJames Collins 5159cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 516a8eebd82SJames Collins $html = '<ul class="mikio-nav">'; 5172b4583abSJames Collins 518ab45ba71SJames Collins $pageToolsMenu = []; 519ab45ba71SJames Collins $siteToolsMenu = []; 520ab45ba71SJames Collins $userToolsMenu = []; 521c165b184SJames Collins 522ab45ba71SJames Collins $showIcons = ($this->getConf('navbarDWMenuType') != 'text'); 523ab45ba71SJames Collins $showText = ($this->getConf('navbarDWMenuType') != 'icons'); 524ab45ba71SJames Collins $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate'); 5252b4583abSJames Collins 5262b4583abSJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 5272b4583abSJames Collins foreach ($items as $item) { 5289cff245bSJames Collins if ($item->getType() !== 'top') { 529ab45ba71SJames Collins $itemHtml = ''; 5302b4583abSJames Collins 531905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5329cff245bSJames Collins if ( 5333a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 5343a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 5353a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5369cff245bSJames Collins ) { 5379cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . 5389cff245bSJames Collins ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 5399cff245bSJames Collins if ($showIcons === true) { 5409cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 5419cff245bSJames Collins } 5429cff245bSJames Collins if ($showText === true || $isDropDown === true) { 5439cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 5449cff245bSJames Collins } 545ab45ba71SJames Collins $itemHtml .= '</a>'; 546ab45ba71SJames Collins 547ab45ba71SJames Collins $pageToolsMenu[] = $itemHtml; 5482b4583abSJames Collins } 5499cff245bSJames Collins }//end if 5509cff245bSJames Collins }//end foreach 5512b4583abSJames Collins 552ab45ba71SJames Collins $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action'); 553ab45ba71SJames Collins foreach ($items as $item) { 554ab45ba71SJames Collins $itemHtml = ''; 5552b4583abSJames Collins 556905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5579cff245bSJames Collins if ( 5583a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 5593a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 5603a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5619cff245bSJames Collins ) { 5629cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' . 5639cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 5649cff245bSJames Collins if ($showIcons === true) { 5659cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 5669cff245bSJames Collins } 5679cff245bSJames Collins if ($showText === true || $isDropDown === true) { 5689cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 5699cff245bSJames Collins } 570ab45ba71SJames Collins $itemHtml .= '</a>'; 5712b4583abSJames Collins 572ab45ba71SJames Collins $siteToolsMenu[] = $itemHtml; 5732b4583abSJames Collins } 5749cff245bSJames Collins }//end foreach 5752b4583abSJames Collins 576ab45ba71SJames Collins $items = (new \dokuwiki\Menu\UserMenu())->getItems('action'); 577ab45ba71SJames Collins foreach ($items as $item) { 578ab45ba71SJames Collins $itemHtml = ''; 579ab45ba71SJames Collins 580905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5819cff245bSJames Collins if ( 5823a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 5833a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 5843a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5859cff245bSJames Collins ) { 5869cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' . 5879cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 5889cff245bSJames Collins if ($showIcons === true) { 5899cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 5909cff245bSJames Collins } 5919cff245bSJames Collins if ($showText === true || $isDropDown === true) { 5929cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 5939cff245bSJames Collins } 594ab45ba71SJames Collins $itemHtml .= '</a>'; 595ab45ba71SJames Collins 596ab45ba71SJames Collins $userToolsMenu[] = $itemHtml; 597ab45ba71SJames Collins } 5989cff245bSJames Collins }//end foreach 599ab45ba71SJames Collins 600ab45ba71SJames Collins 601ab45ba71SJames Collins switch ($this->getConf('navbarDWMenuCombine')) { 602ab45ba71SJames Collins case 'dropdown': 603ab45ba71SJames Collins $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">'; 6049cff245bSJames Collins $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button" 6059cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6069cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('file') : '') . 6079cff245bSJames Collins ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] . 6089cff245bSJames Collins '</span>') . '</a>'; 609a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 610ab45ba71SJames Collins 611ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 612ab45ba71SJames Collins $html .= $item; 613ab45ba71SJames Collins } 614ab45ba71SJames Collins 615ab45ba71SJames Collins $html .= '</div>'; 616ab45ba71SJames Collins $html .= '</li>'; 617ab45ba71SJames Collins 618a8eebd82SJames Collins $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">'; 6199cff245bSJames Collins $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button" 6209cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6219cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('gear') : '') . 6229cff245bSJames Collins ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' . 6239cff245bSJames Collins $lang['site_tools'] . '</span>') . '</a>'; 624a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 625ab45ba71SJames Collins 626ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 627ab45ba71SJames Collins $html .= $item; 628ab45ba71SJames Collins } 629ab45ba71SJames Collins 630ab45ba71SJames Collins $html .= '</div>'; 631ab45ba71SJames Collins $html .= '</li>'; 632ab45ba71SJames Collins 633a8eebd82SJames Collins $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">'; 6349cff245bSJames Collins $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button" 6359cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6369cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('user') : '') . 6379cff245bSJames Collins ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' . 6389cff245bSJames Collins $lang['user_tools'] . '</span>') . '</a>'; 639a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 640ab45ba71SJames Collins 641ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 642ab45ba71SJames Collins $html .= $item; 643ab45ba71SJames Collins } 644ab45ba71SJames Collins 645ab45ba71SJames Collins $html .= '</div>'; 646ab45ba71SJames Collins $html .= '</li>'; 647ab45ba71SJames Collins 648ab45ba71SJames Collins break; 649ab45ba71SJames Collins 650ab45ba71SJames Collins case 'combine': 651ab45ba71SJames Collins $html .= '<li class="mikio-nav-dropdown">'; 6529cff245bSJames Collins $html .= '<a class="mikio-nav-link" href="#">' . 6539cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') . 6549cff245bSJames Collins ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' . 6559cff245bSJames Collins tpl_getLang('tools-menu') . '</span>') . '</a>'; 656a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 657ab45ba71SJames Collins 658ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>'; 659ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 660ab45ba71SJames Collins $html .= $item; 661ab45ba71SJames Collins } 662ab45ba71SJames Collins 663ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 664ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>'; 665ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 666ab45ba71SJames Collins $html .= $item; 667ab45ba71SJames Collins } 668ab45ba71SJames Collins 669ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 670ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>'; 671ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 672ab45ba71SJames Collins $html .= $item; 673ab45ba71SJames Collins } 674ab45ba71SJames Collins 675ab45ba71SJames Collins $html .= '</div>'; 676ab45ba71SJames Collins $html .= '</li>'; 677ab45ba71SJames Collins break; 678ab45ba71SJames Collins 679ab45ba71SJames Collins default: // seperate 680ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 681a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 682ab45ba71SJames Collins } 683ab45ba71SJames Collins 684ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 685a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 686a8eebd82SJames Collins } 687a8eebd82SJames Collins 688a8eebd82SJames Collins foreach ($userToolsMenu as $item) { 689a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 690ab45ba71SJames Collins } 691ab45ba71SJames Collins 692ab45ba71SJames Collins break; 6939cff245bSJames Collins }//end switch 694ab45ba71SJames Collins 695ab45ba71SJames Collins $html .= '</ul>'; 696ab45ba71SJames Collins 6979cff245bSJames Collins if ($print === true) { 6989cff245bSJames Collins echo $html; 6999cff245bSJames Collins } 700a8eebd82SJames Collins return $html; 701a8eebd82SJames Collins } 702a8eebd82SJames Collins 703a8eebd82SJames Collins 704a8eebd82SJames Collins /** 705a8eebd82SJames Collins * Create a nav element from a string. <uri>|<title>; 706a8eebd82SJames Collins * 7079cff245bSJames Collins * @param string $str String to generate nav. 708a8eebd82SJames Collins * @return string nav elements generated 709a8eebd82SJames Collins */ 7109cff245bSJames Collins public function stringToNav(string $str) 71110b40067Snomadjimbob { 712a8eebd82SJames Collins $html = ''; 713a8eebd82SJames Collins 7143a385f2cSJames Collins if (empty($str) === false) { 715a8eebd82SJames Collins $items = explode(';', $str); 716a8eebd82SJames Collins if (count($items) > 0) { 717a8eebd82SJames Collins $html .= '<ul class="mikio-nav">'; 718a8eebd82SJames Collins foreach ($items as $item) { 719a8eebd82SJames Collins $parts = explode('|', $item); 720a8eebd82SJames Collins if ($parts > 1) { 7219cff245bSJames Collins $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' . 7229cff245bSJames Collins strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) . 7239cff245bSJames Collins '</a></li>'; 724a8eebd82SJames Collins } 725a8eebd82SJames Collins } 726a8eebd82SJames Collins $html .= '</ul>'; 727a8eebd82SJames Collins } 7282b4583abSJames Collins } 7292b4583abSJames Collins 730ab45ba71SJames Collins return $html; 7312b4583abSJames Collins } 7322b4583abSJames Collins 733a8eebd82SJames Collins /** 734ab45ba71SJames Collins * print or return the main navbar 7352b4583abSJames Collins * 7369cff245bSJames Collins * @param boolean $print Print the navbar. 7379cff245bSJames Collins * @param boolean $showSub Include the sub navbar. 738ab45ba71SJames Collins * @return string generated content 7392b4583abSJames Collins */ 7409cff245bSJames Collins public function includeNavbar(bool $print = true, bool $showSub = false) 74110b40067Snomadjimbob { 742b39ad16dSJames Collins global $conf, $USERINFO; 743d3d7d2b7SJames Collins 744d3d7d2b7SJames Collins $homeUrl = wl(); 745d3d7d2b7SJames Collins 7469cff245bSJames Collins if (plugin_isdisabled('showpageafterlogin') === false) { 747d3d7d2b7SJames Collins $p = &plugin_load('action', 'showpageafterlogin'); 7483a385f2cSJames Collins if (empty($p) === false) { 7499cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 750d3d7d2b7SJames Collins $homeUrl = wl($p->getConf('page_after_login')); 751d3d7d2b7SJames Collins } 752d3d7d2b7SJames Collins } 753b39ad16dSJames Collins } else { 7549cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 755b39ad16dSJames Collins $url = $this->getConf('brandURLUser'); 756b39ad16dSJames Collins if (strlen($url) > 0) { 757b39ad16dSJames Collins $homeUrl = $url; 758d3d7d2b7SJames Collins } 759b39ad16dSJames Collins } else { 760b39ad16dSJames Collins $url = $this->getConf('brandURLGuest'); 761b39ad16dSJames Collins if (strlen($url) > 0) { 762b39ad16dSJames Collins $homeUrl = $url; 763b39ad16dSJames Collins } 764b39ad16dSJames Collins } 765b39ad16dSJames Collins } 766d3d7d2b7SJames Collins 767ab45ba71SJames Collins $html = ''; 76847161538SJames Collins 7699cff245bSJames Collins $html .= '<nav class="mikio-navbar' . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') . 7709cff245bSJames Collins '">'; 771f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 772d3d7d2b7SJames Collins $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">'; 7739cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) { 774ab45ba71SJames Collins // Brand image 7759cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true) { 7769cff245bSJames Collins $logo = $this->getMediaFile('logo', false); 7779cff245bSJames Collins ; 7783a385f2cSJames Collins if (empty($logo) === false) { 779f0241fc4SJames Collins $width = $this->getConf('navbarTitleIconWidth'); 780f0241fc4SJames Collins $height = $this->getConf('navbarTitleIconHeight'); 781f0241fc4SJames Collins $styles = ''; 782f0241fc4SJames Collins 783f0241fc4SJames Collins if (strlen($width) > 0 || strlen($height) > 0) { 7849cff245bSJames Collins if (ctype_digit($width) === true) { 785f0241fc4SJames Collins $styles .= 'max-width:' . intval($width) . 'px;'; 7869cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) { 787f0241fc4SJames Collins $styles .= 'max-width:' . $width . ';'; 7889cff245bSJames Collins } elseif (strcasecmp($width, 'none') === 0) { 7897a92c19bSJames Collins $styles .= 'max-width:none;'; 790f0241fc4SJames Collins } 791f0241fc4SJames Collins 7929cff245bSJames Collins if (ctype_digit($height) === true) { 793f0241fc4SJames Collins $styles .= 'max-height:' . intval($height) . 'px;'; 7949cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) { 795f0241fc4SJames Collins $styles .= 'max-height:' . $height . ';'; 7969cff245bSJames Collins } elseif (strcasecmp($height, 'none') === 0) { 7977a92c19bSJames Collins $styles .= 'max-height:none;'; 798f0241fc4SJames Collins } 799f0241fc4SJames Collins 800f0241fc4SJames Collins if (strlen($styles) > 0) { 801f0241fc4SJames Collins $styles = ' style="' . $styles . '"'; 802f0241fc4SJames Collins } 8039cff245bSJames Collins }//end if 804f0241fc4SJames Collins 805f0241fc4SJames Collins $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>'; 8069cff245bSJames Collins }//end if 8079cff245bSJames Collins }//end if 808ab45ba71SJames Collins 809ab45ba71SJames Collins // Brand title 8109cff245bSJames Collins if ($this->getConf('navbarUseTitleText') === true) { 811ab45ba71SJames Collins $html .= '<div class="mikio-navbar-brand-title">'; 812a8eebd82SJames Collins $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>'; 8139cff245bSJames Collins if ($this->getConf('navbarUseTaglineText') === true) { 814a8eebd82SJames Collins $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>'; 815ab45ba71SJames Collins } 816ab45ba71SJames Collins $html .= '</div>'; 817ab45ba71SJames Collins } 8189cff245bSJames Collins }//end if 819ab45ba71SJames Collins $html .= '</a>'; 820660b2c71SJames Collins $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>'; 821ab45ba71SJames Collins 822ab45ba71SJames Collins // Menus 823ab45ba71SJames Collins $html .= '<div class="mikio-navbar-collapse">'; 824ab45ba71SJames Collins 8259cff245bSJames Collins $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'), 8269cff245bSJames Collins $this->getConf('navbarPosRight', 'none') 8279cff245bSJames Collins ]; 828a8eebd82SJames Collins foreach ($menus as $menuType) { 829a8eebd82SJames Collins switch ($menuType) { 830a8eebd82SJames Collins case 'custom': 831a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', '')); 832a8eebd82SJames Collins break; 833a8eebd82SJames Collins case 'search': 834ab45ba71SJames Collins $html .= '<div class="mikio-nav-item">'; 835ab45ba71SJames Collins $html .= $this->includeSearch(false); 836ab45ba71SJames Collins $html .= '</div>'; 837a8eebd82SJames Collins break; 838a8eebd82SJames Collins case 'dokuwiki': 8399cff245bSJames Collins $html .= $this->includeDWMenu(false); 840a8eebd82SJames Collins break; 841a8eebd82SJames Collins } 842a8eebd82SJames Collins } 843ab45ba71SJames Collins 844ab45ba71SJames Collins $html .= '</div>'; 845f8039bf2SJames Collins $html .= '</div>'; 846ab45ba71SJames Collins $html .= '</nav>'; 847ab45ba71SJames Collins 848a8eebd82SJames Collins // Sub Navbar 8499cff245bSJames Collins if ($showSub === true) { 8509cff245bSJames Collins $sub = $this->includePage('submenu', false); 8513a385f2cSJames Collins if (empty($sub) === false) { 8529cff245bSJames Collins $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>'; 8539cff245bSJames Collins } 854ab45ba71SJames Collins } 855ab45ba71SJames Collins 8569cff245bSJames Collins if ($print === true) { 8579cff245bSJames Collins echo $html; 8589cff245bSJames Collins } 859ab45ba71SJames Collins return $html; 860ab45ba71SJames Collins } 861ab45ba71SJames Collins 862ab45ba71SJames Collins 863a8eebd82SJames Collins /** 864a8eebd82SJames Collins * Is there a sidebar 865a8eebd82SJames Collins * 8669cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 867a8eebd82SJames Collins * @return boolean if sidebar exists 868a8eebd82SJames Collins */ 8699cff245bSJames Collins public function sidebarExists(string $prefix = '') 87010b40067Snomadjimbob { 871a8eebd82SJames Collins global $conf; 872a8eebd82SJames Collins 8733a385f2cSJames Collins if (strcasecmp($prefix, 'left') === 0) { 8749cff245bSJames Collins $prefix = ''; 8759cff245bSJames Collins } 876a8eebd82SJames Collins 877a8eebd82SJames Collins return $this->pageExists($conf['sidebar' . $prefix]); 878a8eebd82SJames Collins } 879a8eebd82SJames Collins 880a8eebd82SJames Collins 881a8eebd82SJames Collins /** 882ab45ba71SJames Collins * Print or return the sidebar content 883ab45ba71SJames Collins * 8849cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 8859cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 8869cff245bSJames Collins * @param boolean $parse Parse the content. 887ab45ba71SJames Collins * @return string generated content 888ab45ba71SJames Collins */ 8899cff245bSJames Collins public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true) 89010b40067Snomadjimbob { 891ab45ba71SJames Collins global $conf, $ID; 892ab45ba71SJames Collins 893ab45ba71SJames Collins $html = ''; 894ab45ba71SJames Collins $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix)); 895ab45ba71SJames Collins $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix)); 896ab45ba71SJames Collins 8973a385f2cSJames Collins if (empty($confPrefix) === true) { 8989cff245bSJames Collins $confPrefix = 'Left'; 8999cff245bSJames Collins } 9003a385f2cSJames Collins if (strcasecmp($prefix, 'Left') === 0) { 9019cff245bSJames Collins $prefix = ''; 9029cff245bSJames Collins } 903ab45ba71SJames Collins 9043a385f2cSJames Collins empty($sidebarPage = $conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar']; 905ab45ba71SJames Collins 9069cff245bSJames Collins if ( 9079cff245bSJames Collins $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false && 9089cff245bSJames Collins p_get_metadata($ID, 'nosidebar', false) === false 9099cff245bSJames Collins ) { 9109cff245bSJames Collins $content = $this->includePage($sidebarPage . 'header', false); 9113a385f2cSJames Collins if (empty($content) === false) { 9129cff245bSJames Collins $html .= '<div class="mikio-sidebar-header">' . $content . '</div>'; 9139cff245bSJames Collins } 914ab45ba71SJames Collins 9153a385f2cSJames Collins if (empty($prefix) === true) { 9169cff245bSJames Collins $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'), 9179cff245bSJames Collins $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4') 9189cff245bSJames Collins ]; 919ab45ba71SJames Collins 920a8eebd82SJames Collins foreach ($rows as $row) { 921a8eebd82SJames Collins switch ($row) { 922a8eebd82SJames Collins case 'search': 9239cff245bSJames Collins $html .= $this->includeSearch(false); 924a8eebd82SJames Collins break; 925a8eebd82SJames Collins case 'logged in user': 9269cff245bSJames Collins $html .= $this->includeLoggedIn(false); 927a8eebd82SJames Collins break; 928a8eebd82SJames Collins case 'content': 9299cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 9303a385f2cSJames Collins if (empty($content) === false) { 9319cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 9329cff245bSJames Collins } 933a8eebd82SJames Collins break; 934a8eebd82SJames Collins case 'tags': 935a8eebd82SJames Collins $html .= '<div class="mikio-tags"></div>'; 936a8eebd82SJames Collins } 937a8eebd82SJames Collins } 938a8eebd82SJames Collins } else { 9399cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 9403a385f2cSJames Collins if (empty($content) === false) { 9419cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 9429cff245bSJames Collins } 9439cff245bSJames Collins }//end if 9449cff245bSJames Collins 9459cff245bSJames Collins $content = $this->includePage($sidebarPage . 'footer', false); 9463a385f2cSJames Collins if (empty($content) === false) { 9479cff245bSJames Collins $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>'; 9489cff245bSJames Collins } 9499cff245bSJames Collins }//end if 9509cff245bSJames Collins 9513a385f2cSJames Collins if (empty($html) === true) { 9523a385f2cSJames Collins if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) { 9539cff245bSJames Collins $html = ' '; 9549cff245bSJames Collins } 9559cff245bSJames Collins if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) { 9569cff245bSJames Collins $html = ' '; 9579cff245bSJames Collins } 958a8eebd82SJames Collins } 959ab45ba71SJames Collins 9603a385f2cSJames Collins if (empty($html) === false) { 9613a385f2cSJames Collins empty($html = '<aside class="mikio-sidebar mikio-sidebar-' . ($prefix) === true ? 'left' : $prefix) . 9629cff245bSJames Collins '"><a class="mikio-sidebar-toggle' . 9639cff245bSJames Collins ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' . 9649cff245bSJames Collins tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' . 9659cff245bSJames Collins $html . '</div></aside>'; 966ab45ba71SJames Collins } 967ab45ba71SJames Collins 9689cff245bSJames Collins if ($parse === true) { 9699cff245bSJames Collins $html = $this->includeIcons($html); 9703a04a100SJames Collins } 9719cff245bSJames Collins if ($print === true) { 9729cff245bSJames Collins echo $html; 973ab45ba71SJames Collins } 974ab45ba71SJames Collins return $html; 975ab45ba71SJames Collins } 976ab45ba71SJames Collins 977ab45ba71SJames Collins 978a8eebd82SJames Collins /** 979ab45ba71SJames Collins * Print or return the page tools content 980ab45ba71SJames Collins * 9819cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 9829cff245bSJames Collins * @param boolean $includeId Include the dw__pagetools id in the element. 983ab45ba71SJames Collins * @return string generated content 984ab45ba71SJames Collins */ 9859cff245bSJames Collins public function includePageTools(bool $print = true, bool $includeId = false) 98610b40067Snomadjimbob { 9871293ce10SJames Collins global $USERINFO; 9881293ce10SJames Collins 9899cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 990ab45ba71SJames Collins $html = ''; 991ab45ba71SJames Collins 9929cff245bSJames Collins $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">'; 993b9c0582bSJames Collins $html .= '<ul class="tools">'; 994ab45ba71SJames Collins 995ab45ba71SJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 996ab45ba71SJames Collins foreach ($items as $item) { 9979cff245bSJames Collins $classes = []; 9983fd763a0SJames Collins $classes[] = $item->getType(); 9993fd763a0SJames Collins $attr = $item->getLinkAttributes(); 10003fd763a0SJames Collins 10019cff245bSJames Collins if (empty($attr['class']) === false) { 10023fd763a0SJames Collins $classes = array_merge($classes, explode(' ', $attr['class'])); 1003ab45ba71SJames Collins } 1004ab45ba71SJames Collins 10053fd763a0SJames Collins $classes = array_unique($classes); 10063fd763a0SJames Collins 10071293ce10SJames Collins $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType())); 10089cff245bSJames Collins if ( 10093a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 10103a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 10113a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true)) 10129cff245bSJames Collins ) { 10133fd763a0SJames Collins $html .= '<li class="' . implode(' ', $classes) . '">'; 10149cff245bSJames Collins $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' . 10159cff245bSJames Collins $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) . 10169cff245bSJames Collins '</div><span class="a11y">' . $item->getLabel() . '</span></a>'; 10173fd763a0SJames Collins $html .= '</li>'; 10183fd763a0SJames Collins } 10199cff245bSJames Collins }//end foreach 10203fd763a0SJames Collins 10213fd763a0SJames Collins $html .= '</ul>'; 1022ab45ba71SJames Collins $html .= '</nav>'; 1023ab45ba71SJames Collins 10249cff245bSJames Collins if ($print === true) { 10259cff245bSJames Collins echo $html; 10269cff245bSJames Collins } 1027ab45ba71SJames Collins return $html; 1028ab45ba71SJames Collins } 1029ab45ba71SJames Collins 1030ab45ba71SJames Collins 1031a8eebd82SJames Collins /** 1032a8eebd82SJames Collins * Print or return the search bar 1033a8eebd82SJames Collins * 10349cff245bSJames Collins * @param boolean $print Print content. 1035a8eebd82SJames Collins * @return string contents of the search bar 1036a8eebd82SJames Collins */ 10379cff245bSJames Collins public function includeSearch(bool $print = true) 103810b40067Snomadjimbob { 10399cff245bSJames Collins global $lang, $ID, $ACT, $QUERY; 1040ab45ba71SJames Collins $html = ''; 1041ab45ba71SJames Collins 10429cff245bSJames Collins $html .= '<form class="mikio-search search" action="' . wl() . 10439cff245bSJames Collins '" accept-charset="utf-8" method="get" role="search">'; 1044a8eebd82SJames Collins $html .= '<input type="hidden" name="do" value="search">'; 1045a8eebd82SJames Collins $html .= '<input type="hidden" name="id" value="' . $ID . '">'; 1046c1cb9f15SChris MacMackin $html .= '<input name="q" '; 10479cff245bSJames Collins if ($this->getConf('searchUseTypeahead') === true) { 1048c1cb9f15SChris MacMackin $html .= 'class="search_typeahead" '; 1049c1cb9f15SChris MacMackin } 10509cff245bSJames Collins $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' . 10513a385f2cSJames Collins ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />'; 1052a8eebd82SJames Collins $html .= '<button type="submit" title="' . $lang['btn_search'] . '">'; 10533a385f2cSJames Collins if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) { 1054a8eebd82SJames Collins $html .= $this->mikioInlineIcon('search'); 1055ab45ba71SJames Collins } else { 1056ab45ba71SJames Collins $html .= $lang['btn_search']; 1057ab45ba71SJames Collins } 1058ab45ba71SJames Collins $html .= '</button>'; 1059ab45ba71SJames Collins $html .= '</form>'; 1060ab45ba71SJames Collins 10619cff245bSJames Collins if ($print === true) { 10629cff245bSJames Collins echo $html; 10639cff245bSJames Collins } 1064ab45ba71SJames Collins return $html; 1065ab45ba71SJames Collins } 1066ab45ba71SJames Collins 1067ab45ba71SJames Collins 1068a8eebd82SJames Collins /** 1069a8eebd82SJames Collins * Print or return content 1070a8eebd82SJames Collins * 10719cff245bSJames Collins * @param boolean $print Print content. 1072a8eebd82SJames Collins * @return string contents 1073a8eebd82SJames Collins */ 10749cff245bSJames Collins public function includeContent(bool $print = true) 107510b40067Snomadjimbob { 1076ab45ba71SJames Collins ob_start(); 10779cff245bSJames Collins tpl_content(false); 1078ab45ba71SJames Collins $html = ob_get_contents(); 1079ab45ba71SJames Collins ob_end_clean(); 1080ab45ba71SJames Collins 1081ab45ba71SJames Collins $html = $this->includeIcons($html); 1082ab45ba71SJames Collins $html = $this->parseContent($html); 1083ab45ba71SJames Collins 1084ab45ba71SJames Collins $html .= '<div style="clear:both"></div>'; 1085ab45ba71SJames Collins 10869cff245bSJames Collins if ($this->getConf('heroTitle') === false) { 10879cff245bSJames Collins $html = '<div class="mikio-tags"></div>' . $html; 10889cff245bSJames Collins } 1089a8eebd82SJames Collins 1090a8eebd82SJames Collins $html = '<div class="mikio-article-content">' . $html . '</div>'; 1091a8eebd82SJames Collins 10929cff245bSJames Collins if ($print === true) { 10939cff245bSJames Collins echo $html; 10949cff245bSJames Collins } 1095ab45ba71SJames Collins return $html; 1096ab45ba71SJames Collins } 1097ab45ba71SJames Collins 1098a8eebd82SJames Collins /** 1099ab45ba71SJames Collins * Print or return footer 1100ab45ba71SJames Collins * 11019cff245bSJames Collins * @param boolean $print Print footer. 11029cff245bSJames Collins * @return string HTML string containing footer 1103ab45ba71SJames Collins */ 11049cff245bSJames Collins public function includeFooter(bool $print = true) 110510b40067Snomadjimbob { 1106ab45ba71SJames Collins global $ACT; 1107ab45ba71SJames Collins 1108ab45ba71SJames Collins $html = ''; 1109ab45ba71SJames Collins 1110ab45ba71SJames Collins $html .= '<footer class="mikio-footer">'; 11119cff245bSJames Collins $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>'; 11129cff245bSJames Collins $html .= $this->includePage('footer', false); 1113ab45ba71SJames Collins 1114a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('footerCustomMenuText')); 1115ab45ba71SJames Collins 11169cff245bSJames Collins if ($this->getConf('footerSearch') === true) { 1117ab45ba71SJames Collins $html .= '<div class="mikio-footer-search">'; 11189cff245bSJames Collins $html .= $this->includeSearch(false); 1119ab45ba71SJames Collins $html .= '</div>'; 1120ab45ba71SJames Collins } 1121ab45ba71SJames Collins 1122a8eebd82SJames Collins $showPageTools = $this->getConf('pageToolsFooter'); 11239cff245bSJames Collins if ( 11243a385f2cSJames Collins strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 || 11253a385f2cSJames Collins $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0) 11269cff245bSJames Collins ) { 11279cff245bSJames Collins $html .= $this->includePageTools(false); 11289cff245bSJames Collins } 1129ab45ba71SJames Collins 11309cff245bSJames Collins $meta['licenseType'] = ['multichoice', '_choices' => ['none', 'badge', 'button']]; 11319cff245bSJames Collins $meta['licenseImageOnly'] = ['onoff']; 1132ab45ba71SJames Collins 1133ab45ba71SJames Collins $licenseType = $this->getConf('licenseType'); 11349cff245bSJames Collins if ($licenseType !== 'none') { 11359cff245bSJames Collins $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true); 1136ab45ba71SJames Collins } 1137ab45ba71SJames Collins 1138ab45ba71SJames Collins $html .= '</footer>'; 1139ab45ba71SJames Collins 11409cff245bSJames Collins if ($print === true) { 11419cff245bSJames Collins echo $html; 11429cff245bSJames Collins } 1143ab45ba71SJames Collins return $html; 1144ab45ba71SJames Collins } 1145ab45ba71SJames Collins 1146ab45ba71SJames Collins 1147a8eebd82SJames Collins /** 1148ab45ba71SJames Collins * Print or return breadcrumb trail 1149ab45ba71SJames Collins * 11509cff245bSJames Collins * @param boolean $print Print out trail. 11519cff245bSJames Collins * @param boolean $parse Parse trail before printing. 11529cff245bSJames Collins * @return string HTML string containing breadcrumbs 1153ab45ba71SJames Collins */ 11549cff245bSJames Collins public function includeBreadcrumbs(bool $print = true, bool $parse = true) 115510b40067Snomadjimbob { 1156a8eebd82SJames Collins global $conf, $ID, $lang, $ACT; 1157a8eebd82SJames Collins 11583a385f2cSJames Collins if ( 11593a385f2cSJames Collins $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 && 1160*95372bffSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0 11613a385f2cSJames Collins ) { 11629cff245bSJames Collins return ''; 11639cff245bSJames Collins } 1164ab45ba71SJames Collins 1165ab45ba71SJames Collins $html = '<div class="mikio-breadcrumbs">'; 1166f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 11673a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 1168*95372bffSJames Collins if ($conf['breadcrumbs'] !== 0) { 11699cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) { 1170ab45ba71SJames Collins ob_start(); 117175adba86SJames Collins tpl_breadcrumbs(); 1172ab45ba71SJames Collins $html .= ob_get_contents(); 1173ab45ba71SJames Collins ob_end_clean(); 1174ab45ba71SJames Collins } else { 1175ab45ba71SJames Collins $sep = '•'; 1176ab45ba71SJames Collins $prefix = $lang['breadcrumb']; 1177ab45ba71SJames Collins 11789cff245bSJames Collins if ($this->getConf('breadcrumbSep') === true) { 1179ab45ba71SJames Collins $sep = $this->getConf('breadcrumbSepText'); 11809cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-sep', false); 1181ab45ba71SJames Collins 11829cff245bSJames Collins if ($img !== false) { 1183ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1184ab45ba71SJames Collins } 118547161538SJames Collins } 118647161538SJames Collins 11879cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === true) { 1188ab45ba71SJames Collins $prefix = $this->getConf('breadcrumbPrefixText'); 11899cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-prefix', false); 1190ab45ba71SJames Collins 11919cff245bSJames Collins if ($img !== false) { 1192ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 1193ab45ba71SJames Collins } 1194ab45ba71SJames Collins } 1195ab45ba71SJames Collins 1196ab45ba71SJames Collins $crumbs = breadcrumbs(); 1197ab45ba71SJames Collins 1198ab45ba71SJames Collins $html .= '<ul>'; 11993a385f2cSJames Collins if (empty($prefix) === false) { 12009cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 12019cff245bSJames Collins } 1202ab45ba71SJames Collins 1203ab45ba71SJames Collins $last = count($crumbs); 1204ab45ba71SJames Collins $i = 0; 1205ab45ba71SJames Collins foreach ($crumbs as $id => $name) { 1206ab45ba71SJames Collins $i++; 1207*95372bffSJames Collins if ($i !== 1) { 1208ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 1209*95372bffSJames Collins } 12109cff245bSJames Collins $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>'; 12119cff245bSJames Collins $html .= tpl_pagelink($id, null, true); 1212ab45ba71SJames Collins $html .= '</li>'; 1213ab45ba71SJames Collins } 1214ab45ba71SJames Collins 1215ab45ba71SJames Collins $html .= '</ul>'; 12169cff245bSJames Collins }//end if 12179cff245bSJames Collins }//end if 12189cff245bSJames Collins }//end if 12193d11a778SJames Collins 12203d11a778SJames Collins $html .= '</div>'; 12213d11a778SJames Collins $html .= '</div>'; 12223d11a778SJames Collins 12239cff245bSJames Collins if ($parse === true) { 12249cff245bSJames Collins $html = $this->includeIcons($html); 12259cff245bSJames Collins } 12269cff245bSJames Collins if ($print === true) { 12279cff245bSJames Collins echo $html; 12289cff245bSJames Collins } 12293d11a778SJames Collins return $html; 12303d11a778SJames Collins } 12313d11a778SJames Collins 12323d11a778SJames Collins /** 12333d11a778SJames Collins * Print or return you are here trail 12343d11a778SJames Collins * 12359cff245bSJames Collins * @param boolean $print Print out trail. 12369cff245bSJames Collins * @param boolean $parse Parse trail before printing. 12379cff245bSJames Collins * @return string HTML string containing breadcrumbs 12383d11a778SJames Collins */ 12399cff245bSJames Collins public function includeYouAreHere(bool $print = true, bool $parse = true) 12403d11a778SJames Collins { 12413d11a778SJames Collins global $conf, $ID, $lang, $ACT; 12423d11a778SJames Collins 12433a385f2cSJames Collins if ( 12443a385f2cSJames Collins $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 && 1245*95372bffSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0 12463a385f2cSJames Collins ) { 12479cff245bSJames Collins return ''; 12489cff245bSJames Collins } 12493d11a778SJames Collins 12503d11a778SJames Collins $html = '<div class="mikio-youarehere">'; 12513d11a778SJames Collins $html .= '<div class="mikio-container">'; 12523a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 1253*95372bffSJames Collins if ($conf['youarehere'] !== 0) { 12549cff245bSJames Collins if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) { 1255*95372bffSJames Collins $html .= '<div class="mikio-bcdw">'; 1256ab45ba71SJames Collins ob_start(); 125775adba86SJames Collins tpl_youarehere(); 1258ab45ba71SJames Collins $html .= ob_get_contents(); 1259ab45ba71SJames Collins ob_end_clean(); 1260*95372bffSJames Collins $html .= '</div>'; 1261ab45ba71SJames Collins } else { 1262ab45ba71SJames Collins $sep = ' » '; 1263ab45ba71SJames Collins $prefix = $lang['youarehere']; 1264ab45ba71SJames Collins 12659cff245bSJames Collins if ($this->getConf('youarehereSep') === true) { 12663d11a778SJames Collins $sep = $this->getConf('youarehereSepText'); 12679cff245bSJames Collins $img = $this->getMediaFile('youarehere-sep', false); 1268ab45ba71SJames Collins 12699cff245bSJames Collins if ($img !== false) { 1270ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1271ab45ba71SJames Collins } 127275adba86SJames Collins } 127375adba86SJames Collins 12749cff245bSJames Collins if ($this->getConf('youareherePrefix') === true) { 12753d11a778SJames Collins $prefix = $this->getConf('youareherePrefixText'); 12769cff245bSJames Collins $img = $this->getMediaFile('youarehere-prefix', false); 1277ab45ba71SJames Collins 12789cff245bSJames Collins if ($img !== false) { 1279ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 128075adba86SJames Collins } 128147161538SJames Collins } 128247161538SJames Collins 1283ab45ba71SJames Collins $html .= '<ul>'; 12843a385f2cSJames Collins if (empty($prefix) === false) { 12859cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 12869cff245bSJames Collins } 12879cff245bSJames Collins $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>'; 1288ab45ba71SJames Collins 1289ab45ba71SJames Collins $parts = explode(':', $ID); 1290ab45ba71SJames Collins $count = count($parts); 1291ab45ba71SJames Collins 1292ab45ba71SJames Collins $part = ''; 12939cff245bSJames Collins for ($i = 0; $i < ($count - 1); $i++) { 1294ab45ba71SJames Collins $part .= $parts[$i] . ':'; 1295ab45ba71SJames Collins $page = $part; 12969cff245bSJames Collins if ($page === $conf['start']) { 12979cff245bSJames Collins continue; 12989cff245bSJames Collins } 1299ab45ba71SJames Collins 1300ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 13019cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1302ab45ba71SJames Collins } 1303ab45ba71SJames Collins 1304ab45ba71SJames Collins resolve_pageid('', $page, $exists); 13059cff245bSJames Collins if ((isset($page) === true && $page === $part . $parts[$i]) === false) { 1306ab45ba71SJames Collins $page = $part . $parts[$i]; 13079cff245bSJames Collins if ($page !== $conf['start']) { 1308ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 13099cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1310ab45ba71SJames Collins } 1311ab45ba71SJames Collins } 1312ab45ba71SJames Collins 1313ab45ba71SJames Collins $html .= '</ul>'; 13149cff245bSJames Collins }//end if 13159cff245bSJames Collins }//end if 1316ab45ba71SJames Collins 13173d11a778SJames Collins $showLast = $this->getConf('youarehereShowLast'); 13189cff245bSJames Collins if ($showLast !== 0) { 1319a8eebd82SJames Collins preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches); 13209cff245bSJames Collins if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) { 1321a8eebd82SJames Collins $count = count($matches[0]); 1322a8eebd82SJames Collins $list = ''; 1323a8eebd82SJames Collins 1324a8eebd82SJames Collins // Show Home 1325a8eebd82SJames Collins $list .= $matches[0][0] . $matches[0][1]; 1326a8eebd82SJames Collins 1327a8eebd82SJames Collins $list .= '<li>...</li>'; 13289cff245bSJames Collins for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) { 1329a8eebd82SJames Collins $list .= $matches[0][$i]; 1330a8eebd82SJames Collins } 1331a8eebd82SJames Collins 1332a8eebd82SJames Collins $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html); 1333a8eebd82SJames Collins } 1334a8eebd82SJames Collins } 1335a8eebd82SJames Collins 13363d11a778SJames Collins switch ($this->getConf('youarehereHome')) { 1337a8eebd82SJames Collins case 'none': 1338a8eebd82SJames Collins $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2); 1339a8eebd82SJames Collins break; 1340a8eebd82SJames Collins case 'home': 1341a8eebd82SJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1); 1342a8eebd82SJames Collins break; 1343a8eebd82SJames Collins case 'icon': 13449cff245bSJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . 13459cff245bSJames Collins $this->mikioInlineIcon('home') . '$3', $html, 1); 1346a8eebd82SJames Collins break; 1347a8eebd82SJames Collins } 1348a8eebd82SJames Collins } else { 1349a8eebd82SJames Collins $html .= '≪ '; 13509cff245bSJames Collins if (isset($_GET['page']) === true) { 13519cff245bSJames Collins $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a> / '; 1352a8eebd82SJames Collins } 13534057121fSJames Collins $html .= '<a href="' . wl($ID) . '">View Page</a>'; 13549cff245bSJames Collins }//end if 13559cff245bSJames Collins 13569cff245bSJames Collins $html .= '</div>'; 13579cff245bSJames Collins $html .= '</div>'; 13589cff245bSJames Collins 13599cff245bSJames Collins if ($parse === true) { 13609cff245bSJames Collins $html = $this->includeIcons($html); 1361a8eebd82SJames Collins } 13629cff245bSJames Collins if ($print === true) { 13639cff245bSJames Collins echo $html; 13649cff245bSJames Collins } 1365ab45ba71SJames Collins return $html; 1366ab45ba71SJames Collins } 1367ab45ba71SJames Collins 13681785fc73SJames Collins /** 13691785fc73SJames Collins * Get Page Title 13709cff245bSJames Collins * 13719cff245bSJames Collins * @return string page title 13721785fc73SJames Collins */ 137310b40067Snomadjimbob public function parsePageTitle() 137410b40067Snomadjimbob { 13752060e56cSJames Collins global $ID; 13762060e56cSJames Collins 13772060e56cSJames Collins $title = p_get_first_heading($ID); 13789cff245bSJames Collins if (strlen($title) <= 0) { 13799cff245bSJames Collins $title = tpl_pagetitle(null, true); 13809cff245bSJames Collins } 13811785fc73SJames Collins $title = $this->includeIcons($title); 13821785fc73SJames Collins 13831785fc73SJames Collins return $title; 13841785fc73SJames Collins } 13851785fc73SJames Collins 1386ab45ba71SJames Collins 138775adba86SJames Collins /** 1388a8eebd82SJames Collins * Print or return hero block 138975adba86SJames Collins * 13909cff245bSJames Collins * @param boolean $print Print content. 1391a8eebd82SJames Collins * @return string contents of hero 139275adba86SJames Collins */ 13939cff245bSJames Collins public function includeHero(bool $print = true) 139410b40067Snomadjimbob { 1395a8eebd82SJames Collins $html = ''; 139647161538SJames Collins 13979cff245bSJames Collins if ($this->getConf('heroTitle') === true) { 1398a8eebd82SJames Collins $html .= '<div class="mikio-hero">'; 1399f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 1400a8eebd82SJames Collins $html .= '<div class="mikio-hero-text">'; 14013a385f2cSJames Collins if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) { 14029cff245bSJames Collins $html .= $this->includeYouAreHere(false); 14039cff245bSJames Collins } 14043a385f2cSJames Collins if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) { 14059cff245bSJames Collins $html .= $this->includeBreadcrumbs(false); 14069cff245bSJames Collins } 1407ab45ba71SJames Collins 1408a8eebd82SJames Collins $html .= '<h1 class="mikio-hero-title">'; 14091785fc73SJames Collins $html .= $this->parsePageTitle(); // No idea why this requires a blank space afterwards to work? 1410a8eebd82SJames Collins $html .= '</h1>'; 1411a8eebd82SJames Collins $html .= '<h2 class="mikio-hero-subtitle"></h2>'; 1412a8eebd82SJames Collins $html .= '</div>'; 141347161538SJames Collins 14149cff245bSJames Collins $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true)); 1415a8eebd82SJames Collins $hero_image_resize_class = ''; 14163a385f2cSJames Collins if (empty($hero_image) === false) { 1417a8eebd82SJames Collins $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"'; 1418a8eebd82SJames Collins $hero_image_resize_class = ' mikio-hero-image-resize'; 141947161538SJames Collins } 1420a8eebd82SJames Collins 14219cff245bSJames Collins $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image . 14229cff245bSJames Collins '><div class="mikio-tags"></div></div>'; 1423a8eebd82SJames Collins 1424a8eebd82SJames Collins $html .= '</div>'; 1425f8039bf2SJames Collins $html .= '</div>'; 14269cff245bSJames Collins }//end if 14279cff245bSJames Collins 14289cff245bSJames Collins if ($print === true) { 14299cff245bSJames Collins echo $html; 143075adba86SJames Collins } 1431a8eebd82SJames Collins 1432a8eebd82SJames Collins return $html; 143375adba86SJames Collins } 143475adba86SJames Collins 143575adba86SJames Collins 143675adba86SJames Collins /** 1437a8eebd82SJames Collins * Print or return out TOC 143875adba86SJames Collins * 14399cff245bSJames Collins * @param boolean $print Print TOC. 14409cff245bSJames Collins * @param boolean $parse Parse icons. 1441a8eebd82SJames Collins * @return string contents of TOC 144275adba86SJames Collins */ 14439cff245bSJames Collins public function includeTOC(bool $print = true, bool $parse = true) 144410b40067Snomadjimbob { 1445ab45ba71SJames Collins $html = ''; 14462b4583abSJames Collins 1447ab45ba71SJames Collins $tocHtml = tpl_toc(true); 1448ab45ba71SJames Collins 14493a385f2cSJames Collins if (empty($tocHtml) === false) { 1450ab45ba71SJames Collins $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml); 1451a8eebd82SJames Collins $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml); 1452ab45ba71SJames Collins 1453ab45ba71SJames Collins $html .= '<div class="mikio-toc">'; 1454ab45ba71SJames Collins $html .= $tocHtml; 1455ab45ba71SJames Collins $html .= '</div>'; 14562b4583abSJames Collins } 14572b4583abSJames Collins 14589cff245bSJames Collins if ($parse === true) { 14599cff245bSJames Collins $html = $this->includeIcons($html); 14609cff245bSJames Collins } 14619cff245bSJames Collins 14629cff245bSJames Collins if ($print === true) { 1463ab45ba71SJames Collins echo $html; 1464ab45ba71SJames Collins } 1465ab45ba71SJames Collins 14669cff245bSJames Collins return $html; 14679cff245bSJames Collins } 14689cff245bSJames Collins 1469ab45ba71SJames Collins 1470a8eebd82SJames Collins /** 1471ab45ba71SJames Collins * Parse the string and replace icon elements with included icon libraries 1472ab45ba71SJames Collins * 14739cff245bSJames Collins * @param string $str Content to parse. 1474ab45ba71SJames Collins * @return string parsed string 1475ab45ba71SJames Collins */ 14769cff245bSJames Collins public function includeIcons(string $str) 147710b40067Snomadjimbob { 1478ab45ba71SJames Collins global $ACT, $MIKIO_ICONS; 1479ab45ba71SJames Collins 1480ab45ba71SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 14813a385f2cSJames Collins if (empty($iconTag) === true) { 14829cff245bSJames Collins return $str; 14839cff245bSJames Collins } 1484ab45ba71SJames Collins 14859cff245bSJames Collins if ( 14869cff245bSJames Collins in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true || 14873a385f2cSJames Collins strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0 14889cff245bSJames Collins ) { 1489a2005a27SJames Collins $content = $str; 1490a2005a27SJames Collins $preview = null; 1491a2005a27SJames Collins 14923a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 14939cff245bSJames Collins $html = new \simple_html_dom(); 1494a2005a27SJames Collins $html->stripRNAttrValues = false; 1495a2005a27SJames Collins $html->load($str, true, false); 1496a2005a27SJames Collins 1497a2005a27SJames Collins $preview = $html->find('div.preview'); 14989cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1499a2005a27SJames Collins $content = $preview[0]->innertext; 1500a2005a27SJames Collins } 1501a2005a27SJames Collins } 1502a2005a27SJames Collins 15031785fc73SJames Collins $page_regex = '/(.*)/'; 15049cff245bSJames Collins if (stripos($str, '<pre') !== false) { 15051785fc73SJames Collins $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/'; 15061785fc73SJames Collins } 15071785fc73SJames Collins 15081785fc73SJames Collins $content = preg_replace_callback($page_regex, function ($icons) { 1509a2005a27SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 1510a2005a27SJames Collins 151110b40067Snomadjimbob return preg_replace_callback( 151210b40067Snomadjimbob '/<' . $iconTag . ' ([\w\- #]*)>(?=[^>]*(<|$))/', 1513ab45ba71SJames Collins function ($matches) { 1514ab45ba71SJames Collins global $MIKIO_ICONS; 1515ab45ba71SJames Collins 1516ab45ba71SJames Collins $s = $matches[0]; 1517ab45ba71SJames Collins 1518ab45ba71SJames Collins if (count($MIKIO_ICONS) > 0) { 1519ab45ba71SJames Collins $icon = $MIKIO_ICONS[0]; 1520ab45ba71SJames Collins 1521ab45ba71SJames Collins if (count($matches) > 1) { 1522ab45ba71SJames Collins $e = explode(' ', $matches[1]); 1523ab45ba71SJames Collins 1524ab45ba71SJames Collins if (count($e) > 1) { 1525ab45ba71SJames Collins foreach ($MIKIO_ICONS as $iconItem) { 15269cff245bSJames Collins if (strcasecmp($iconItem['name'], $e[0]) === 0) { 1527ab45ba71SJames Collins $icon = $iconItem; 1528ab45ba71SJames Collins 1529ab45ba71SJames Collins $s = $icon['insert']; 1530ab45ba71SJames Collins for ($i = 1; $i < 9; $i++) { 15313a385f2cSJames Collins if (count(empty($e) < $i || $e[$i]) === true) { 15329cff245bSJames Collins if (isset($icon['$' . $i]) === true) { 1533ab45ba71SJames Collins $s = str_replace('$' . $i, $icon['$' . $i], $s); 1534ab45ba71SJames Collins } 1535ab45ba71SJames Collins } else { 1536ab45ba71SJames Collins $s = str_replace('$' . $i, $e[$i], $s); 1537ab45ba71SJames Collins } 1538ab45ba71SJames Collins } 1539ab45ba71SJames Collins 1540ab45ba71SJames Collins $dir = ''; 15419cff245bSJames Collins if (isset($icon['dir']) === true) { 15429cff245bSJames Collins $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/'; 15439cff245bSJames Collins } 1544ab45ba71SJames Collins 1545ab45ba71SJames Collins $s = str_replace('$0', $dir, $s); 1546ab45ba71SJames Collins 1547ab45ba71SJames Collins break; 15489cff245bSJames Collins }//end if 15499cff245bSJames Collins }//end foreach 1550ab45ba71SJames Collins } else { 1551ab45ba71SJames Collins $s = str_replace('$1', $matches[1], $icon['insert']); 15529cff245bSJames Collins }//end if 15539cff245bSJames Collins }//end if 15549cff245bSJames Collins }//end if 155575adba86SJames Collins 1556ab45ba71SJames Collins $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count); 15579cff245bSJames Collins if ($count === 0) { 1558ab45ba71SJames Collins $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s); 1559ab45ba71SJames Collins } 1560ab45ba71SJames Collins 1561ab45ba71SJames Collins return $s; 1562ab45ba71SJames Collins }, 156310b40067Snomadjimbob $icons[0] 156410b40067Snomadjimbob ); 1565a2005a27SJames Collins }, $content); 1566a2005a27SJames Collins 15673a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 15689cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1569a2005a27SJames Collins $preview[0]->innertext = $content; 1570a2005a27SJames Collins } 1571a2005a27SJames Collins 1572a2005a27SJames Collins $str = $html->save(); 1573a2005a27SJames Collins $html->clear(); 1574a2005a27SJames Collins unset($html); 1575a2005a27SJames Collins } else { 1576a2005a27SJames Collins $str = $content; 1577a2005a27SJames Collins } 15789cff245bSJames Collins }//end if 1579ab45ba71SJames Collins 1580ab45ba71SJames Collins return $str; 1581ab45ba71SJames Collins } 158247161538SJames Collins 1583c165b184SJames Collins /** 1584a8eebd82SJames Collins * Parse HTML for theme 1585c165b184SJames Collins * 15869cff245bSJames Collins * @param string $content HTML content to parse. 1587a8eebd82SJames Collins * @return string Parsed content 1588c165b184SJames Collins */ 15899cff245bSJames Collins public function parseContent(string $content) 159010b40067Snomadjimbob { 1591ab45ba71SJames Collins global $INPUT, $ACT; 1592ab45ba71SJames Collins 1593a8eebd82SJames Collins // Add Mikio Section titles 15943a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 15959cff245bSJames Collins $admin_sections = [ 1596ab45ba71SJames Collins // Section Insert Before Icon 15979cff245bSJames Collins 'navbar' => ['navbarUseTitleIcon', ''], 15989cff245bSJames Collins 'search' => ['searchButton', ''], 15999cff245bSJames Collins 'hero' => ['heroTitle', ''], 16009cff245bSJames Collins 'tags' => ['tagsConsolidate', ''], 16019cff245bSJames Collins 'breadcrumb' => ['breadcrumbHideHome', ''], 16029cff245bSJames Collins 'youarehere' => ['youarehereHideHome', ''], 16039cff245bSJames Collins 'sidebar' => ['sidebarShowLeft', ''], 16049cff245bSJames Collins 'toc' => ['tocFull', ''], 16059cff245bSJames Collins 'pagetools' => ['pageToolsFloating', ''], 16069cff245bSJames Collins 'footer' => ['footerCustomMenuText', ''], 16079cff245bSJames Collins 'license' => ['licenseType', ''], 16089cff245bSJames Collins 'acl' => ['includePageUseACL', ''], 16099cff245bSJames Collins 'sticky' => ['stickyTopHeader', ''], 16109cff245bSJames Collins ]; 1611ab45ba71SJames Collins 1612ab45ba71SJames Collins foreach ($admin_sections as $section => $items) { 1613ab45ba71SJames Collins $search = $items[0]; 1614ab45ba71SJames Collins $icon = $items[1]; 1615ab45ba71SJames Collins 161610b40067Snomadjimbob $content = preg_replace( 1617adf52ebbSJames Collins '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/', 16189cff245bSJames Collins '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) . 16199cff245bSJames Collins tpl_getLang('config_' . $section) . 16209cff245bSJames Collins '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' . 16219cff245bSJames Collins $search . '</span>', 162210b40067Snomadjimbob $content 162310b40067Snomadjimbob ); 1624ab45ba71SJames Collins } 16259cff245bSJames Collins }//end if 1626ab45ba71SJames Collins 16273a385f2cSJames Collins if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) { 1628a8eebd82SJames Collins $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content); 1629a8eebd82SJames Collins } 1630ab45ba71SJames Collins 1631a8eebd82SJames Collins // Page Revisions - Table Fix 16329cff245bSJames Collins if (strpos($content, 'id="page__revisions"') !== false) { 16339cff245bSJames Collins $content = preg_replace( 16349cff245bSJames Collins '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/', 16359cff245bSJames Collins '<span>$1</span>', 16369cff245bSJames Collins $content 16379cff245bSJames Collins ); 1638a8eebd82SJames Collins } 1639ab45ba71SJames Collins 16409cff245bSJames Collins $html = new \simple_html_dom(); 1641bc1032d9SJames Collins $html->stripRNAttrValues = false; 1642c165b184SJames Collins $html->load($content, true, false); 1643c165b184SJames Collins 16449cff245bSJames Collins if ($html === false) { 16459cff245bSJames Collins return $content; 16469cff245bSJames Collins } 1647ab45ba71SJames Collins 1648ab45ba71SJames Collins /* Buttons */ 1649ab45ba71SJames Collins foreach ($html->find('#config__manager button') as $node) { 1650ab45ba71SJames Collins $c = explode(' ', $node->class); 16519cff245bSJames Collins if (in_array('mikio-button', $c) === false) { 16529cff245bSJames Collins $c[] = 'mikio-button'; 16539cff245bSJames Collins } 1654ab45ba71SJames Collins $node->class = implode(' ', $c); 1655c165b184SJames Collins } 1656c165b184SJames Collins 1657ab45ba71SJames Collins 1658ab45ba71SJames Collins /* Buttons - Primary */ 1659ab45ba71SJames Collins foreach ($html->find('#config__manager [type=submit]') as $node) { 1660ab45ba71SJames Collins $c = explode(' ', $node->class); 16619cff245bSJames Collins if (in_array('mikio-primary', $c) === false) { 16629cff245bSJames Collins $c[] = 'mikio-primary'; 16639cff245bSJames Collins } 1664ab45ba71SJames Collins $node->class = implode(' ', $c); 1665ab45ba71SJames Collins } 1666ab45ba71SJames Collins 1667a8eebd82SJames Collins /* Hide page title if hero is enabled */ 16689cff245bSJames Collins if ($this->getConf('heroTitle') === true && $ACT !== 'preview') { 16691785fc73SJames Collins $pageTitle = $this->parsePageTitle(); 167047161538SJames Collins 167147161538SJames Collins foreach ($html->find('h1,h2,h3,h4') as $elm) { 16729cff245bSJames Collins if ($elm->innertext === $pageTitle) { 1673a8eebd82SJames Collins // $elm->innertext = ''; 1674a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1675a8eebd82SJames Collins 167647161538SJames Collins break; 167747161538SJames Collins } 167847161538SJames Collins } 167947161538SJames Collins } 1680c165b184SJames Collins 1681a8eebd82SJames Collins /* Hero subtitle */ 16822b4583abSJames Collins foreach ($html->find('p') as $elm) { 16832b4583abSJames Collins $i = stripos($elm->innertext, '~~hero-subtitle'); 16842b4583abSJames Collins if ($i !== false) { 16859cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 16862b4583abSJames Collins if ($j !== false) { 16879cff245bSJames Collins if ($j > ($i + 16)) { 16889cff245bSJames Collins $subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16)); 1689a8eebd82SJames Collins $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')'; 1690a8eebd82SJames Collins 1691a8eebd82SJames Collins // $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2); 1692a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext); 16932b4583abSJames Collins } 16942b4583abSJames Collins 16952b4583abSJames Collins break; 16962b4583abSJames Collins } 16972b4583abSJames Collins } 16982b4583abSJames Collins } 16992b4583abSJames Collins 1700a8eebd82SJames Collins /* Hero image */ 1701a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1702a8eebd82SJames Collins $image = ''; 1703a8eebd82SJames Collins preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches); 1704a8eebd82SJames Collins if (count($matches) > 0) { 1705a8eebd82SJames Collins preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches); 1706a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1707a8eebd82SJames Collins $image = $imageTagMatches[1]; 1708a8eebd82SJames Collins } else { 1709a8eebd82SJames Collins preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches); 1710a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1711a8eebd82SJames Collins $image = $imageTagMatches[1]; 1712a8eebd82SJames Collins } else { 1713a8eebd82SJames Collins $image = strip_tags($matches[1]); 17149cff245bSJames Collins if (stripos($image, ':') === false) { 17159cff245bSJames Collins $image = str_replace(['{', '}'], '', $image); 1716a8eebd82SJames Collins $i = stripos($image, '?'); 17179cff245bSJames Collins if ($i !== false) { 1718a8eebd82SJames Collins $image = substr($image, 0, $i); 1719c165b184SJames Collins } 1720c165b184SJames Collins 1721a8eebd82SJames Collins $image = ml($image, '', true, '', false); 1722ab45ba71SJames Collins } 1723ab45ba71SJames Collins } 1724ab45ba71SJames Collins } 1725ab45ba71SJames Collins 1726a8eebd82SJames Collins $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')'; 1727a8eebd82SJames Collins 1728a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext); 17299cff245bSJames Collins }//end if 17309cff245bSJames Collins }//end foreach 1731ab45ba71SJames Collins 17329cff245bSJames Collins /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color] 17339cff245bSJames Collins [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */ 1734a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1735a8eebd82SJames Collins $i = stripos($elm->innertext, '~~hero-colors'); 1736a8eebd82SJames Collins if ($i !== false) { 17379cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 1738a8eebd82SJames Collins if ($j !== false) { 17399cff245bSJames Collins if ($j > ($i + 14)) { 17409cff245bSJames Collins $color = substr($elm->innertext, ($i + 14), ($j - $i - 14)); 1741a8eebd82SJames Collins $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')'; 1742ab45ba71SJames Collins 1743a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext); 1744ab45ba71SJames Collins } 1745ab45ba71SJames Collins 1746a8eebd82SJames Collins break; 1747ab45ba71SJames Collins } 1748ab45ba71SJames Collins } 1749ab45ba71SJames Collins } 1750ab45ba71SJames Collins 175196ec8e1eSJames Collins /* Hide parts - ~~hide-parts [parts]~~ */ 175296ec8e1eSJames Collins foreach ($html->find('p') as $elm) { 175396ec8e1eSJames Collins $i = stripos($elm->innertext, '~~hide-parts'); 175496ec8e1eSJames Collins if ($i !== false) { 17559cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 175696ec8e1eSJames Collins if ($j !== false) { 17579cff245bSJames Collins if ($j > ($i + 13)) { 17589cff245bSJames Collins $parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13))); 175996ec8e1eSJames Collins $script = ''; 176096ec8e1eSJames Collins 176196ec8e1eSJames Collins foreach ($parts as $part) { 176296ec8e1eSJames Collins // $part = trim($part); 176396ec8e1eSJames Collins if (strlen($part) > 0) { 176496ec8e1eSJames Collins $script .= 'mikio.hidePart(\'' . $part . '\');'; 176596ec8e1eSJames Collins } 176696ec8e1eSJames Collins } 176796ec8e1eSJames Collins 176896ec8e1eSJames Collins if (strlen($script) > 0) { 176996ec8e1eSJames Collins $this->footerScript['hide-parts'] = $script; 177096ec8e1eSJames Collins } 177196ec8e1eSJames Collins 177296ec8e1eSJames Collins $elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext); 177396ec8e1eSJames Collins } 177496ec8e1eSJames Collins 177596ec8e1eSJames Collins break; 17769cff245bSJames Collins }//end if 17779cff245bSJames Collins }//end if 17789cff245bSJames Collins }//end foreach 177996ec8e1eSJames Collins 178096ec8e1eSJames Collins 1781a8eebd82SJames Collins /* Page Tags (tag plugin) */ 17829cff245bSJames Collins if ($this->getConf('tagsConsolidate') === true) { 1783a8eebd82SJames Collins $tags = ''; 1784a8eebd82SJames Collins foreach ($html->find('div.tags a') as $elm) { 1785a8eebd82SJames Collins $tags .= $elm->outertext; 1786a8eebd82SJames Collins } 1787a8eebd82SJames Collins 1788a8eebd82SJames Collins foreach ($html->find('div.tags') as $elm) { 1789a8eebd82SJames Collins $elm->innertext = ''; 1790a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1791a8eebd82SJames Collins } 1792a8eebd82SJames Collins 17933a385f2cSJames Collins if (empty($tags) === false) { 1794a8eebd82SJames Collins $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')'; 1795a8eebd82SJames Collins } 1796ab45ba71SJames Collins } 1797ab45ba71SJames Collins 1798ab45ba71SJames Collins // Configuration Manager 17993a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 1800ab45ba71SJames Collins // Additional save buttons 1801ab45ba71SJames Collins foreach ($html->find('#config__manager') as $cm) { 1802ab45ba71SJames Collins $saveButtons = ''; 1803ab45ba71SJames Collins 1804ab45ba71SJames Collins foreach ($cm->find('p') as $elm) { 1805ab45ba71SJames Collins $saveButtons = $elm->outertext; 1806a8eebd82SJames Collins $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons); 1807ab45ba71SJames Collins $elm->outertext = ''; 1808ab45ba71SJames Collins } 1809ab45ba71SJames Collins 1810ab45ba71SJames Collins foreach ($cm->find('fieldset') as $elm) { 1811ab45ba71SJames Collins $elm->innertext .= $saveButtons; 1812ab45ba71SJames Collins } 1813ab45ba71SJames Collins } 1814ab45ba71SJames Collins } 1815ab45ba71SJames Collins 1816ab45ba71SJames Collins $content = $html->save(); 1817c165b184SJames Collins $html->clear(); 1818c165b184SJames Collins unset($html); 1819c165b184SJames Collins 1820c165b184SJames Collins return $content; 1821c165b184SJames Collins } 18222b4583abSJames Collins 18232b4583abSJames Collins 1824a8eebd82SJames Collins /** 1825a8eebd82SJames Collins * Get DokuWiki namespace/page/URI as link 1826a8eebd82SJames Collins * 18279cff245bSJames Collins * @param string $str String to parse. 18289cff245bSJames Collins * @return string parsed URI 1829a8eebd82SJames Collins */ 18309cff245bSJames Collins public function getLink(string $str) 183110b40067Snomadjimbob { 18322b4583abSJames Collins $i = strpos($str, '://'); 18339cff245bSJames Collins if ($i !== false) { 18349cff245bSJames Collins return $str; 18359cff245bSJames Collins } 18362b4583abSJames Collins 18372b4583abSJames Collins return wl($str); 18382b4583abSJames Collins } 1839ab45ba71SJames Collins 1840ab45ba71SJames Collins 1841a8eebd82SJames Collins /** 1842a8eebd82SJames Collins * Check if the user can edit current namespace/page 1843a8eebd82SJames Collins * 1844a8eebd82SJames Collins * @return boolean user can edit 1845a8eebd82SJames Collins */ 184610b40067Snomadjimbob public function userCanEdit() 184710b40067Snomadjimbob { 1848ab45ba71SJames Collins global $INFO; 1849ab45ba71SJames Collins global $ID; 1850ab45ba71SJames Collins 1851ab45ba71SJames Collins $wiki_file = wikiFN($ID); 18529cff245bSJames Collins if (@file_exists($wiki_file) === false) { 18539cff245bSJames Collins return true; 18549cff245bSJames Collins } 18559cff245bSJames Collins if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) { 18569cff245bSJames Collins return true; 18579cff245bSJames Collins } 1858a8eebd82SJames Collins // $meta_file = metaFN($ID, '.meta'); 18599cff245bSJames Collins if ($INFO['meta']['user'] === false) { 18609cff245bSJames Collins return true; 18619cff245bSJames Collins } 18629cff245bSJames Collins if ($INFO['client'] === $INFO['meta']['user']) { 18639cff245bSJames Collins return true; 18649cff245bSJames Collins } 1865ab45ba71SJames Collins 1866ab45ba71SJames Collins return false; 1867c165b184SJames Collins } 186847161538SJames Collins 186947161538SJames Collins 1870a8eebd82SJames Collins /** 1871a8eebd82SJames Collins * Search for and return the uri of a media file 1872a8eebd82SJames Collins * 18739cff245bSJames Collins * @param string $image Image name to search for (without extension). 18749cff245bSJames Collins * @param boolean $searchCurrentNS Search the current namespace. 18759cff245bSJames Collins * @param boolean $propagate Propagate search through the namespace. 18769cff245bSJames Collins * @return string URI of the found media file 1877a8eebd82SJames Collins */ 18789cff245bSJames Collins public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true) 187910b40067Snomadjimbob { 1880ab45ba71SJames Collins global $INFO; 1881a8eebd82SJames Collins 18829cff245bSJames Collins $ext = ['png', 'jpg', 'gif', 'svg']; 1883ab45ba71SJames Collins 18849cff245bSJames Collins if ($searchCurrentNS === true) { 18859cff245bSJames Collins $prefix[] = ':' . $INFO['namespace'] . ':'; 18869cff245bSJames Collins } 18879cff245bSJames Collins if ($propagate === true) { 1888ab45ba71SJames Collins $prefix[] = ':'; 1889ab45ba71SJames Collins $prefix[] = ':wiki:'; 1890a8eebd82SJames Collins } 1891ab45ba71SJames Collins $theme = $this->getConf('customTheme'); 18923a385f2cSJames Collins if (empty($theme) === false) { 18939cff245bSJames Collins $prefix[] = 'themes/' . $theme . '/images/'; 18949cff245bSJames Collins } 1895ab45ba71SJames Collins $prefix[] = 'images/'; 1896ab45ba71SJames Collins 18979cff245bSJames Collins $search = []; 1898ab45ba71SJames Collins foreach ($prefix as $pitem) { 1899ab45ba71SJames Collins foreach ($ext as $eitem) { 1900ab45ba71SJames Collins $search[] = $pitem . $image . '.' . $eitem; 1901ab45ba71SJames Collins } 1902ab45ba71SJames Collins } 1903ab45ba71SJames Collins 1904ab45ba71SJames Collins $img = ''; 1905ab45ba71SJames Collins $file = ''; 1906ab45ba71SJames Collins $url = ''; 1907ab45ba71SJames Collins $ismedia = false; 1908ab45ba71SJames Collins $found = false; 1909ab45ba71SJames Collins 1910ab45ba71SJames Collins foreach ($search as $img) { 19113a385f2cSJames Collins if (strcasecmp(substr($img, 0, 1), ':') === 0) { 1912ab45ba71SJames Collins $file = mediaFN($img); 1913ab45ba71SJames Collins $ismedia = true; 1914ab45ba71SJames Collins } else { 1915ab45ba71SJames Collins $file = tpl_incdir() . $img; 1916ab45ba71SJames Collins $ismedia = false; 1917ab45ba71SJames Collins } 1918ab45ba71SJames Collins 19199cff245bSJames Collins if (file_exists($file) === true) { 1920ab45ba71SJames Collins $found = true; 1921ab45ba71SJames Collins break; 1922ab45ba71SJames Collins } 1923ab45ba71SJames Collins } 1924ab45ba71SJames Collins 19259cff245bSJames Collins if ($found === false) { 19269cff245bSJames Collins return false; 19279cff245bSJames Collins } 1928ab45ba71SJames Collins 19299cff245bSJames Collins if ($ismedia === true) { 1930ab45ba71SJames Collins $url = ml($img, '', true, '', false); 1931ab45ba71SJames Collins } else { 1932ab45ba71SJames Collins $url = tpl_basedir() . $img; 1933ab45ba71SJames Collins } 1934ab45ba71SJames Collins 1935ab45ba71SJames Collins return $url; 1936ab45ba71SJames Collins } 1937ab45ba71SJames Collins 1938a8eebd82SJames Collins 1939a8eebd82SJames Collins /** 1940ab45ba71SJames Collins * Print or return the page title 1941ab45ba71SJames Collins * 19429cff245bSJames Collins * @param string $page Page id or empty string for current page. 1943ab45ba71SJames Collins * @return string generated content 1944ab45ba71SJames Collins */ 19459cff245bSJames Collins public function getPageTitle(string $page = '') 194610b40067Snomadjimbob { 1947ab45ba71SJames Collins global $ID, $conf; 1948ab45ba71SJames Collins 1949ab45ba71SJames Collins $html = ''; 1950ab45ba71SJames Collins 19513a385f2cSJames Collins if (empty($page) === true) { 19529cff245bSJames Collins $page = $ID; 19539cff245bSJames Collins } 1954ab45ba71SJames Collins 1955ab45ba71SJames Collins $html = p_get_first_heading($page); 1956ab45ba71SJames Collins $html = strip_tags($html); 1957ab45ba71SJames Collins $html = preg_replace('/\s+/', ' ', $html); 1958ab45ba71SJames Collins $html .= ' [' . strip_tags($conf['title']) . ']'; 1959ab45ba71SJames Collins $html = trim($html); 1960ab45ba71SJames Collins 1961ab45ba71SJames Collins return $html; 1962ab45ba71SJames Collins } 1963a8eebd82SJames Collins 1964a8eebd82SJames Collins 1965a8eebd82SJames Collins /** 1966a8eebd82SJames Collins * Return inline theme icon 1967a8eebd82SJames Collins * 19689cff245bSJames Collins * @param string $type Icon to retreive. 19699cff245bSJames Collins * @return string HTML icon content 1970a8eebd82SJames Collins */ 19719cff245bSJames Collins public function mikioInlineIcon(string $type) 197210b40067Snomadjimbob { 1973a8eebd82SJames Collins switch ($type) { 1974a8eebd82SJames Collins case 'wrench': 19759cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 19769cff245bSJames 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 19779cff245bSJames 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 19789cff245bSJames 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 19799cff245bSJames 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, 19809cff245bSJames 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, 19819cff245bSJames 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>'; 1982a8eebd82SJames Collins case 'file': 19839cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 19849cff245bSJames 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 19859cff245bSJames 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, 19869cff245bSJames 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 19879cff245bSJames Collinsl 408,-408 q 28,-28 48,-76 20,-48 20,-88 z" id="path2993" inkscape:connector-curvature="0" 19889cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 1989a8eebd82SJames Collins case 'gear': 19909cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 19919cff245bSJames Collinsstyle="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027"><path d="m 1024,640 q 0,106 19929cff245bSJames 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 19939cff245bSJames 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, 19949cff245bSJames 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 19959cff245bSJames 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 19969cff245bSJames 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, 19979cff245bSJames 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 19989cff245bSJames 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 19999cff245bSJames 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 20009cff245bSJames 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>'; 2001a8eebd82SJames Collins case 'user': 20029cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 20039cff245bSJames 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 20049cff245bSJames 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 20059cff245bSJames 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 20069cff245bSJames 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 20079cff245bSJames 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 20089cff245bSJames 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 20099cff245bSJames Collins1088,1024 z"/></g></svg>'; 2010a8eebd82SJames Collins case 'search': 20119cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" 20129cff245bSJames 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 20139cff245bSJames 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 20149cff245bSJames 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 20159cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>'; 2016a8eebd82SJames Collins case 'home': 20179cff245bSJames Collins return '<svg class="mikio-iicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 1792" 20189cff245bSJames Collinsaria-hidden="true" style="fill:currentColor"><g transform="matrix(1,0,0,-1,68.338983,1285.4237)" id="g3015"> 20199cff245bSJames 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, 20209cff245bSJames 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, 20219cff245bSJames 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, 20229cff245bSJames 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, 20239cff245bSJames Collins-182 q 10,-8 11,-21.5 1,-13.5 -7,-23.5 z" id="path3017" inkscape:connector-curvature="0" 20249cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 20259cff245bSJames Collins }//end switch 2026ab45ba71SJames Collins 2027a8eebd82SJames Collins return ''; 2028a8eebd82SJames Collins } 2029ab45ba71SJames Collins 2030a8eebd82SJames Collins /** 2031a8eebd82SJames Collins * Finalize theme 20329cff245bSJames Collins * 20339cff245bSJames Collins * @return void 2034a8eebd82SJames Collins */ 203510b40067Snomadjimbob public function finalize() 203610b40067Snomadjimbob { 2037a8eebd82SJames Collins } 20381785fc73SJames Collins 20391785fc73SJames Collins /** 20401785fc73SJames Collins * Show Messages 20419cff245bSJames Collins * 20429cff245bSJames Collins * @return void 20431785fc73SJames Collins */ 204410b40067Snomadjimbob public function showMessages() 204510b40067Snomadjimbob { 20461785fc73SJames Collins global $ACT; 20471785fc73SJames Collins 20489cff245bSJames Collins if ($this->lessIgnored === true) { 20499cff245bSJames Collins msg( 20509cff245bSJames Collins 'useLESS is enabled on the Mikio template, however is not supported on this server', 20519cff245bSJames Collins 2, 20529cff245bSJames Collins '', 20539cff245bSJames Collins '', 20549cff245bSJames Collins MSG_ADMINS_ONLY 20559cff245bSJames Collins ); 2056a8df40efSJames Collins } 2057a8df40efSJames Collins 20581785fc73SJames Collins $show = $this->getConf('showNotifications'); 20593a385f2cSJames Collins if ( 20603a385f2cSJames Collins strcasecmp($show, 'always') === 0 || 20613a385f2cSJames Collins (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0) 20623a385f2cSJames Collins ) { 20631785fc73SJames Collins global $MSG, $MSG_shown; 20641785fc73SJames Collins 20659cff245bSJames Collins if (isset($MSG) === false) { 20661785fc73SJames Collins return; 20671785fc73SJames Collins } 20681785fc73SJames Collins 20699cff245bSJames Collins if (isset($MSG_shown) === false) { 20709cff245bSJames Collins $MSG_shown = []; 2071a8df40efSJames Collins } 20721785fc73SJames Collins 20731785fc73SJames Collins foreach ($MSG as $msg) { 20741785fc73SJames Collins $hash = md5($msg['msg']); 20759cff245bSJames Collins if (isset($MSG_shown[$hash]) === true) { 20761785fc73SJames Collins continue; 20771785fc73SJames Collins } 20781785fc73SJames Collins // skip double messages 20791785fc73SJames Collins 20809cff245bSJames Collins if (info_msg_allowed($msg) === true) { 20819cff245bSJames Collins echo '<div class="' . $msg['lvl'] . '">'; 20829cff245bSJames Collins echo $msg['msg']; 20839cff245bSJames Collins echo '</div>'; 20841785fc73SJames Collins } 20851785fc73SJames Collins 2086a8df40efSJames Collins $MSG_shown[$hash] = true; 20871785fc73SJames Collins } 20881785fc73SJames Collins 20891785fc73SJames Collins unset($GLOBALS['MSG']); 20909cff245bSJames Collins }//end if 20911785fc73SJames Collins } 20927ac0a6efSJames Collins 20937ac0a6efSJames Collins /** 20947ac0a6efSJames Collins * Dokuwiki version 20957ac0a6efSJames Collins * 20967ac0a6efSJames Collins * @return string the dw version name 20977ac0a6efSJames Collins */ 20989cff245bSJames Collins public function dwVersion() 20999cff245bSJames Collins { 21009cff245bSJames Collins if (function_exists('getVersionData') === true) { 21017ac0a6efSJames Collins $version_data = getVersionData(); 21029cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 21037ac0a6efSJames Collins $version_items = explode(' ', $version_data['date']); 21047ac0a6efSJames Collins if (count($version_items) >= 2) { 21057ac0a6efSJames Collins return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1])); 21067ac0a6efSJames Collins } 21077ac0a6efSJames Collins } 21087ac0a6efSJames Collins } 21097ac0a6efSJames Collins 21107ac0a6efSJames Collins return 'unknown'; 21117ac0a6efSJames Collins } 2112e4c4fb13SJames Collins 2113e4c4fb13SJames Collins /** 2114e4c4fb13SJames Collins * Dokuwiki version number 2115e4c4fb13SJames Collins * 2116e4c4fb13SJames Collins * @return string the dw version date converted to integer 2117e4c4fb13SJames Collins */ 21189cff245bSJames Collins public function dwVersionNumber() 21199cff245bSJames Collins { 21209cff245bSJames Collins if (function_exists('getVersionData') === true) { 2121e4c4fb13SJames Collins $version_data = getVersionData(); 21229cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 2123e4c4fb13SJames Collins $version_items = explode(' ', $version_data['date']); 2124e4c4fb13SJames Collins if (count($version_items) >= 1) { 2125e4c4fb13SJames Collins return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0]))); 2126e4c4fb13SJames Collins } 2127e4c4fb13SJames Collins } 2128e4c4fb13SJames Collins } 2129e4c4fb13SJames Collins 2130e4c4fb13SJames Collins return 0; 2131e4c4fb13SJames Collins } 2132a8eebd82SJames Collins} 2133ab45ba71SJames Collins 2134ab45ba71SJames Collinsglobal $TEMPLATE; 213547161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance(); 2136