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 /** 55ab45ba71SJames Collins * Returns the instance of the class 5647161538SJames Collins * 57ab45ba71SJames Collins * @return Template class instance 5847161538SJames Collins */ 5947161538SJames Collins public static function getInstance() 6047161538SJames Collins { 6147161538SJames Collins static $instance = null; 6247161538SJames Collins 633a385f2cSJames Collins if (empty($instance) === true) { 6447161538SJames Collins $instance = new Template(); 6547161538SJames Collins } 6647161538SJames Collins 6747161538SJames Collins return $instance; 6847161538SJames Collins } 6947161538SJames Collins 70ab45ba71SJames Collins 7147161538SJames Collins /** 72ab45ba71SJames Collins * Register the themes hooks into Dokuwiki 739cff245bSJames Collins * 749cff245bSJames Collins * @return void 75c165b184SJames Collins */ 769cff245bSJames Collins private function registerHooks() 7710b40067Snomadjimbob { 78c165b184SJames Collins global $EVENT_HANDLER; 79c165b184SJames Collins 809cff245bSJames Collins $events_dispatcher = [ 81ab45ba71SJames Collins 'TPL_METAHEADER_OUTPUT' => 'metaheadersHandler' 829cff245bSJames Collins ]; 83c165b184SJames Collins 84c165b184SJames Collins foreach ($events_dispatcher as $event => $method) { 85c165b184SJames Collins $EVENT_HANDLER->register_hook($event, 'BEFORE', $this, $method); 86c165b184SJames Collins } 87c165b184SJames Collins } 88c165b184SJames Collins 89c165b184SJames Collins 90c165b184SJames Collins /** 91ab45ba71SJames Collins * Meta handler hook for DokuWiki 92c165b184SJames Collins * 939cff245bSJames Collins * @param \Doku_Event $event DokuWiki Event. 949cff245bSJames Collins * @return void 95c165b184SJames Collins */ 9610b40067Snomadjimbob public function metaHeadersHandler(\Doku_Event $event) 9710b40067Snomadjimbob { 98ab45ba71SJames Collins global $MIKIO_ICONS; 99b5536b07SChris MacMackin global $conf; 100ab45ba71SJames Collins 101ad182e6dSnomadjimbob global $MIKIO_TEMPLATE; 102ad182e6dSnomadjimbob $MIKIO_TEMPLATE = '123'; 103ad182e6dSnomadjimbob 1049cff245bSJames Collins $this->includePage('theme', false, true); 105a8eebd82SJames Collins 1069cff245bSJames Collins $stylesheets = []; 1079cff245bSJames Collins $scripts = []; 108c165b184SJames Collins 1093a385f2cSJames Collins if (empty($this->getConf('customTheme')) === false) { 1109cff245bSJames Collins if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.less') === true) { 111a8eebd82SJames Collins $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.less'; 112a8eebd82SJames Collins } else { 1139cff245bSJames Collins if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/style.css') === true) { 114ab45ba71SJames Collins $stylesheets[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/style.css'; 1152b4583abSJames Collins } 116a8eebd82SJames Collins } 1179cff245bSJames Collins if (file_exists($this->tplDir . 'themes/' . $this->getConf('customTheme') . '/script.js') === true) { 118ab45ba71SJames Collins $scripts[] = $this->baseDir . 'themes/' . $this->getConf('customTheme') . '/script.js'; 119c165b184SJames Collins } 120c165b184SJames Collins } 121c165b184SJames Collins 1223a385f2cSJames Collins if (is_array($MIKIO_ICONS) === true && empty($this->getConf('iconTag', 'icon')) === false) { 1239cff245bSJames Collins $icons = []; 124ab45ba71SJames Collins foreach ($MIKIO_ICONS as $icon) { 1259cff245bSJames Collins if (isset($icon['name']) === true && isset($icon['css']) === true && isset($icon['insert']) === true) { 126ab45ba71SJames Collins $icons[] = $icon; 127c165b184SJames Collins 1283a385f2cSJames Collins if (empty($icon['css']) === false) { 1299cff245bSJames Collins if (strpos($icon['css'], '//') === false) { 130a8eebd82SJames Collins $stylesheets[] = $this->baseDir . 'icons/' . $icon['css']; 131ab45ba71SJames Collins } else { 132a8eebd82SJames Collins $stylesheets[] = $icon['css']; 133ab45ba71SJames Collins } 134ab45ba71SJames Collins } 135ab45ba71SJames Collins } 136ab45ba71SJames Collins } 137ab45ba71SJames Collins $MIKIO_ICONS = $icons; 138ab45ba71SJames Collins } else { 139ab45ba71SJames Collins $MIKIO_ICONS = []; 140ab45ba71SJames Collins } 141c165b184SJames Collins 1427864545bSChris MacMackin $scripts[] = $this->baseDir . 'assets/mikio-typeahead.js'; 143ab45ba71SJames Collins $scripts[] = $this->baseDir . 'assets/mikio.js'; 144644fd9f9SJames Collins 1459cff245bSJames Collins if ($this->getConf('useLESS') === true) { 146ab45ba71SJames Collins $stylesheets[] = $this->baseDir . 'assets/mikio.less'; 147644fd9f9SJames Collins } else { 148644fd9f9SJames Collins $stylesheets[] = $this->baseDir . 'assets/mikio.css'; 149644fd9f9SJames Collins } 150644fd9f9SJames Collins 151ad182e6dSnomadjimbob /* MikioPlugin Support */ 1529ffe9161Snomadjimbob if (plugin_load('action', 'mikioplugin') !== null) { 153ad182e6dSnomadjimbob if ($this->getConf('useLESS') === true) { 154ad182e6dSnomadjimbob $stylesheets[] = $this->baseDir . 'assets/mikioplugin.less'; 155ad182e6dSnomadjimbob } else { 156ad182e6dSnomadjimbob $stylesheets[] = $this->baseDir . 'assets/mikioplugin.css'; 157ad182e6dSnomadjimbob } 158ad182e6dSnomadjimbob } 159ab45ba71SJames Collins 160ab45ba71SJames Collins $set = []; 161c165b184SJames Collins foreach ($stylesheets as $style) { 1629cff245bSJames Collins if (in_array($style, $set) === false) { 1633a385f2cSJames Collins if (strcasecmp(substr($style, -5), '.less') === 0 && $this->getConf('useLESS') === true) { 164ab45ba71SJames Collins $style = $this->baseDir . 'css.php?css=' . str_replace($this->baseDir, '', $style); 165ab45ba71SJames Collins } 166ab45ba71SJames Collins 1679cff245bSJames Collins array_unshift($event->data['link'], [ 168c165b184SJames Collins 'type' => 'text/css', 169c165b184SJames Collins 'rel' => 'stylesheet', 170c165b184SJames Collins 'href' => $style 1719cff245bSJames Collins ]); 172c165b184SJames Collins } 173ab45ba71SJames Collins $set[] = $style; 174ab45ba71SJames Collins } 175c165b184SJames Collins 176ab45ba71SJames Collins $set = []; 177c165b184SJames Collins foreach ($scripts as $script) { 1789cff245bSJames Collins if (in_array($script, $set) === false) { 1799cff245bSJames Collins $script_params = [ 180c165b184SJames Collins 'type' => 'text/javascript', 181c165b184SJames Collins '_data' => '', 1828395cdcbSChris MacMackin 'src' => $script 1839cff245bSJames Collins ]; 184c1ecb866SJames Collins 185c1ecb866SJames Collins // equal to or greator than hogfather 186c1ecb866SJames Collins if ($this->dwVersionNumber() >= 20200729) { 187c1ecb866SJames Collins // greator than hogfather - defer always on 188c1ecb866SJames Collins if ($this->dwVersionNumber() >= 20200729) { 189c1ecb866SJames Collins $script_params += ['defer' => 'defer']; 190c1ecb866SJames Collins } else { 191c1ecb866SJames Collins // hogfather - defer always on unless $conf['defer_js'] is false 1929cff245bSJames Collins if (array_key_exists('defer_js', $conf) === false || $conf['defer_js'] === true) { 1938395cdcbSChris MacMackin $script_params += ['defer' => 'defer']; 1948395cdcbSChris MacMackin } 195c1ecb866SJames Collins } 196c1ecb866SJames Collins } 197c1ecb866SJames Collins 1988395cdcbSChris MacMackin $event->data['script'][] = $script_params; 1999cff245bSJames Collins }//end if 200ab45ba71SJames Collins $set[] = $script; 2019cff245bSJames Collins }//end foreach 202c165b184SJames Collins } 203c165b184SJames Collins 204c165b184SJames Collins 205c165b184SJames Collins /** 206a8eebd82SJames Collins * Print or return the footer meta data 207c165b184SJames Collins * 2089cff245bSJames Collins * @param boolean $print Print the data to buffer. 2099cff245bSJames Collins * @return string HTML footer meta data 210c165b184SJames Collins */ 2119cff245bSJames Collins public function includeFooterMeta(bool $print = true) 21210b40067Snomadjimbob { 213a8eebd82SJames Collins $html = ''; 214a8eebd82SJames Collins 215a8eebd82SJames Collins if (count($this->footerScript) > 0) { 216a8eebd82SJames Collins $html .= '<script type="text/javascript">function mikioFooterRun() {'; 217a8eebd82SJames Collins foreach ($this->footerScript as $script) { 218a8eebd82SJames Collins $html .= $script . ';'; 219a8eebd82SJames Collins } 220a8eebd82SJames Collins $html .= '}</script>'; 221a8eebd82SJames Collins } 222c165b184SJames Collins 223c165b184SJames Collins 2249cff245bSJames Collins if ($print === true) { 2259cff245bSJames Collins echo $html; 2269cff245bSJames Collins } 227a8eebd82SJames Collins return $html; 228a8eebd82SJames Collins } 229a8eebd82SJames Collins 23095372bffSJames Collins 23195372bffSJames Collins // phpcs:disable Squiz.Commenting.FunctionComment.TypeHintMissing 23295372bffSJames Collins 23395372bffSJames Collins 234a8eebd82SJames Collins /** 235ab45ba71SJames Collins * Retreive and parse theme configuration options 236c165b184SJames Collins * 2379cff245bSJames Collins * @param string $key The configuration key to retreive. 2389cff245bSJames Collins * @param mixed $default If key doesn't exist, return this value. 239ab45ba71SJames Collins * @return mixed parsed value of configuration 240c165b184SJames Collins */ 24195372bffSJames Collins public function getConf(string $key, $default = false) 24210b40067Snomadjimbob { 243c165b184SJames Collins $value = tpl_getConf($key, $default); 244c165b184SJames Collins 2453a385f2cSJames Collins $data = [ 2463a385f2cSJames Collins ['keys' => ['navbarDWMenuType'], 'type' => 'choice', 2473a385f2cSJames Collins 'values' => ['both', 'icons', 'text'] 2483a385f2cSJames Collins ], 2493a385f2cSJames Collins ['keys' => ['navbarDWMenuCombine'], 'type' => 'choice', 2503a385f2cSJames Collins 'values' => ['combine', 'seperate', 'dropdown'] 2513a385f2cSJames Collins ], 2523a385f2cSJames Collins ['keys' => ['navbarPosLeft', 'navbarPosMiddle', 'navbarPosRight'], 2533a385f2cSJames Collins 'type' => 'choice', 2543a385f2cSJames Collins 'values' => ['none', 'custom', 'search', 'dokuwiki'], 2553a385f2cSJames Collins 'default' => [ 2563a385f2cSJames Collins 'navbarPosLeft' => 'none', 2573a385f2cSJames Collins 'navbarPosMiddle' => 'search', 2583a385f2cSJames Collins 'navbarPosRight' => 'dokuwiki' 2593a385f2cSJames Collins ] 2603a385f2cSJames Collins ], 2613a385f2cSJames Collins ['keys' => ['navbarItemShowCreate', 'navbarItemShowShow', 'navbarItemShowRevs', 'navbarItemShowBacklink', 2623a385f2cSJames Collins 'navbarItemShowRecent', 'navbarItemShowMedia', 'navbarItemShowIndex', 'navbarItemShowProfile', 2633a385f2cSJames Collins 'navbarItemShowAdmin' 2643a385f2cSJames Collins ], 2653a385f2cSJames Collins 'type' => 'choice', 2663a385f2cSJames Collins 'values' => ['always', 'logged in', 'logged out', 'never'] 2673a385f2cSJames Collins ], 2683a385f2cSJames Collins ['keys' => ['navbarItemShowLogin', 'navbarItemShowLogout'], 2693a385f2cSJames Collins 'type' => 'choice', 2703a385f2cSJames Collins 'values' => ['always', 'never'] 2713a385f2cSJames Collins ], 2723a385f2cSJames Collins ['keys' => ['searchButton'], 'type' => 'choice', 2733a385f2cSJames Collins 'values' => ['icon', 'text'] 2743a385f2cSJames Collins ], 2753a385f2cSJames Collins ['keys' => ['breadcrumbPosition', 'youareherePosition'], 2763a385f2cSJames Collins 'type' => 'choice', 2773a385f2cSJames Collins 'values' => ['top', 'hero', 'page', 'none'] 2783a385f2cSJames Collins ], 2793a385f2cSJames Collins ['keys' => ['youarehereHome'], 'type' => 'choice', 2803a385f2cSJames Collins 'values' => ['page title', 'home', 'icon', 'none'] 2813a385f2cSJames Collins ], 2823a385f2cSJames Collins ['keys' => ['sidebarLeftRow1', 'sidebarLeftRow2', 'sidebarLeftRow3', 'sidebarLeftRow4'], 2833a385f2cSJames Collins 'type' => 'choice', 2843a385f2cSJames Collins 'values' => ['none', 'logged in user', 'search', 'content', 'tags'], 2853a385f2cSJames Collins 'default' => [ 2863a385f2cSJames Collins 'sidebarLeftRow1' => 'logged in user', 2873a385f2cSJames Collins 'sidebarLeftRow2' => 'search', 2883a385f2cSJames Collins 'sidebarLeftRow3' => 'content' 2893a385f2cSJames Collins ] 2903a385f2cSJames Collins ], 2913a385f2cSJames Collins ['keys' => ['pageToolsFloating', 'pageToolsFooter'], 2923a385f2cSJames Collins 'type' => 'choice', 2933a385f2cSJames Collins 'values' => ['always', 'none', 'page editors'] 2943a385f2cSJames Collins ], 2953a385f2cSJames Collins ['keys' => ['pageToolsShowCreate', 'pageToolsShowEdit', 'pageToolsShowRevs', 'pageToolsShowBacklink', 2963a385f2cSJames Collins 'pageToolsShowTop' 2973a385f2cSJames Collins ], 2983a385f2cSJames Collins 'type' => 'choice', 2993a385f2cSJames Collins 'values' => ['always', 'logged in', 'logged out', 'never'] 3003a385f2cSJames Collins ], 3013a385f2cSJames Collins ['keys' => ['showNotifications'], 'type' => 'choice', 3023a385f2cSJames Collins 'values' => ['admin', 'always', 'none'] 3033a385f2cSJames Collins ], 3043a385f2cSJames Collins ['keys' => ['licenseType'], 'type' => 'choice', 3053a385f2cSJames Collins 'values' => ['badge', 'button', 'none'] 3063a385f2cSJames Collins ], 3073a385f2cSJames Collins ['keys' => ['navbarUseTitleIcon'], 'type' => 'bool'], 3083a385f2cSJames Collins ['keys' => ['navbarUseTitleText'], 'type' => 'bool'], 3093a385f2cSJames Collins ['keys' => ['navbarUseTaglineText'], 'type' => 'bool'], 3103a385f2cSJames Collins ['keys' => ['navbarShowSub'], 'type' => 'bool'], 3113a385f2cSJames Collins ['keys' => ['heroTitle'], 'type' => 'bool'], 3123a385f2cSJames Collins ['keys' => ['heroImagePropagation'], 'type' => 'bool'], 3133a385f2cSJames Collins ['keys' => ['breadcrumbPrefix'], 'type' => 'bool'], 3143a385f2cSJames Collins ['keys' => ['breadcrumbSep'], 'type' => 'bool'], 3153a385f2cSJames Collins ['keys' => ['youareherePrefix'], 'type' => 'bool'], 3163a385f2cSJames Collins ['keys' => ['youarehereSep'], 'type' => 'bool'], 3173a385f2cSJames Collins ['keys' => ['sidebarShowLeft'], 'type' => 'bool'], 3183a385f2cSJames Collins ['keys' => ['sidebarShowRight'], 'type' => 'bool'], 3193a385f2cSJames Collins ['keys' => ['tocFull'], 'type' => 'bool'], 3203a385f2cSJames Collins ['keys' => ['footerSearch'], 'type' => 'bool'], 3213a385f2cSJames Collins ['keys' => ['licenseImageOnly'], 'type' => 'bool'], 3223a385f2cSJames Collins ['keys' => ['includePageUseACL'], 'type' => 'bool'], 3233a385f2cSJames Collins ['keys' => ['includePagePropagate'], 'type' => 'bool'], 3243a385f2cSJames Collins ['keys' => ['youarehereHideHome'], 'type' => 'bool'], 3253a385f2cSJames Collins ['keys' => ['tagsConsolidate'], 'type' => 'bool'], 3263a385f2cSJames Collins ['keys' => ['footerInPage'], 'type' => 'bool'], 3273a385f2cSJames Collins ['keys' => ['sidebarMobileDefaultCollapse'], 'type' => 'bool'], 3283a385f2cSJames Collins ['keys' => ['sidebarAlwaysShowLeft'], 'type' => 'bool'], 3293a385f2cSJames Collins ['keys' => ['sidebarAlwaysShowRight'], 'type' => 'bool'], 3303a385f2cSJames Collins ['keys' => ['searchUseTypeahead'], 'type' => 'bool'], 33112030b10SJames Collins ['keys' => ['showLightDark'], 'type' => 'bool'], 33234d5f19aSJames Collins ['keys' => ['autoLightDark'], 'type' => 'bool'], 3333a385f2cSJames Collins ['keys' => ['youarehereShowLast'], 'type' => 'int'], 3343a385f2cSJames Collins 3353a385f2cSJames Collins ['keys' => ['iconTag'], 'type' => 'string'], 3363a385f2cSJames Collins ['keys' => ['customTheme'], 'type' => 'string'], 3373a385f2cSJames Collins ['keys' => ['navbarCustomMenuText'], 'type' => 'string'], 3383a385f2cSJames Collins ['keys' => ['breadcrumbPrefixText'], 'type' => 'string'], 3393a385f2cSJames Collins ['keys' => ['breadcrumbSepText'], 'type' => 'string'], 3403a385f2cSJames Collins ['keys' => ['youareherePrefixText'], 'type' => 'string'], 3413a385f2cSJames Collins ['keys' => ['youarehereSepText'], 'type' => 'string'], 3423a385f2cSJames Collins ['keys' => ['footerCustomMenuText'], 'type' => 'string'], 3433a385f2cSJames Collins ['keys' => ['brandURLGuest'], 'type' => 'string'], 3443a385f2cSJames Collins ['keys' => ['brandURLUser'], 'type' => 'string'], 3453a385f2cSJames Collins 3463a385f2cSJames Collins ['keys' => ['useLESS'], 'type' => 'less'], 3473a385f2cSJames Collins ]; 3483a385f2cSJames Collins 3493a385f2cSJames Collins foreach ($data as $row) { 3503a385f2cSJames Collins // does not check case.... 3513a385f2cSJames Collins if (in_array($key, $row['keys']) === true) { 35295372bffSJames Collins if (array_key_exists('type', $row) === true) { 3533a385f2cSJames Collins switch ($row['type']) { 3543a385f2cSJames Collins case 'bool': 3553a385f2cSJames Collins return (bool) $value; 3563a385f2cSJames Collins case 'int': 3573a385f2cSJames Collins return (int) $value; 3583a385f2cSJames Collins case 'string': 3593a385f2cSJames Collins return $value; 3603a385f2cSJames Collins case 'less': 36129118ed7SJames Collins $value = (bool) $value; 362a8df40efSJames Collins $lessAvailable = true; 363a8df40efSJames Collins 364a8df40efSJames Collins // check for less library 365a8df40efSJames Collins $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3669cff245bSJames Collins if (file_exists($lesscLib) === false) { 367a8df40efSJames Collins $lesscLib = $_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3689cff245bSJames Collins } 3699cff245bSJames Collins if (file_exists($lesscLib) === false) { 370a8df40efSJames Collins $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3719cff245bSJames Collins } 3729cff245bSJames Collins if (file_exists($lesscLib) === false) { 3739cff245bSJames Collins $lesscLib = $_SERVER['DOCUMENT_ROOT'] . 3749cff245bSJames Collins '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 3759cff245bSJames Collins } 3769cff245bSJames Collins if (file_exists($lesscLib) === false) { 377a8df40efSJames Collins $lessAvailable = false; 378a8df40efSJames Collins } 379a8df40efSJames Collins 380a8df40efSJames Collins // check for ctype extensions 3819cff245bSJames Collins if (function_exists('ctype_digit') === false) { 382a8df40efSJames Collins $lessAvailable = false; 383a8df40efSJames Collins } 384a8df40efSJames Collins 3859cff245bSJames Collins if ($value === true && $lessAvailable === false) { 386a8df40efSJames Collins $this->lessIgnored = true; 38729118ed7SJames Collins $value = false; 38829118ed7SJames Collins } 3893a385f2cSJames Collins 3903a385f2cSJames Collins return $value; 3919cff245bSJames Collins }//end switch 3923a385f2cSJames Collins }//end if 3933a385f2cSJames Collins 3943a385f2cSJames Collins if (in_array($value, $row['values']) === true) { 3953a385f2cSJames Collins return $value; 3963a385f2cSJames Collins } 3973a385f2cSJames Collins 3983a385f2cSJames Collins if (array_key_exists('default', $row) === true) { 3993a385f2cSJames Collins if (is_array($row['default']) === true) { 4003a385f2cSJames Collins if (array_key_exists($key, $row['default']) === true) { 4013a385f2cSJames Collins return $row['default'][$key]; 4023a385f2cSJames Collins } 4033a385f2cSJames Collins } else { 4043a385f2cSJames Collins return $row['default']; 4053a385f2cSJames Collins } 4063a385f2cSJames Collins } 4073a385f2cSJames Collins 4083a385f2cSJames Collins return reset($row['values']); 4093a385f2cSJames Collins }//end if 4103a385f2cSJames Collins }//end foreach 411c165b184SJames Collins 412c165b184SJames Collins return $value; 413c165b184SJames Collins } 414c165b184SJames Collins 415c165b184SJames Collins 41695372bffSJames Collins // phpcs:enable 41795372bffSJames Collins 41895372bffSJames Collins 419c165b184SJames Collins /** 420a8eebd82SJames Collins * Check if a page exist in directory or namespace 421c165b184SJames Collins * 4229cff245bSJames Collins * @param string $page Page/namespace to search. 423a8eebd82SJames Collins * @return boolean if page exists 424c165b184SJames Collins */ 4259cff245bSJames Collins public function pageExists(string $page) 42610b40067Snomadjimbob { 427ab45ba71SJames Collins ob_start(); 428a8eebd82SJames Collins tpl_includeFile($page . '.html'); 429ab45ba71SJames Collins $html = ob_get_contents(); 430ab45ba71SJames Collins ob_end_clean(); 431a8eebd82SJames Collins 4323a385f2cSJames Collins if (empty($html) === false) { 4339cff245bSJames Collins return true; 4349cff245bSJames Collins } 435a8eebd82SJames Collins 436a8eebd82SJames Collins $useACL = $this->getConf('includePageUseACL'); 437a8eebd82SJames Collins $propagate = $this->getConf('includePagePropagate'); 438a8eebd82SJames Collins 4399cff245bSJames Collins if ($propagate === true) { 4409cff245bSJames Collins if (page_findnearest($page, $useACL) !== false) { 4419cff245bSJames Collins return true; 4429cff245bSJames Collins } 4439cff245bSJames Collins } elseif ($useACL === true && auth_quickaclcheck($page) !== AUTH_NONE) { 4449cff245bSJames Collins return true; 445ab45ba71SJames Collins } 446ab45ba71SJames Collins 4479cff245bSJames Collins return false; 448ab45ba71SJames Collins } 449ab45ba71SJames Collins 450a8eebd82SJames Collins 451c165b184SJames Collins /** 452a8eebd82SJames Collins * Print or return page from directory or namespace 4532b4583abSJames Collins * 4549cff245bSJames Collins * @param string $page Page/namespace to include. 4559cff245bSJames Collins * @param boolean $print Print content. 4569cff245bSJames Collins * @param boolean $parse Parse content before printing/returning. 4579cff245bSJames Collins * @param string $classWrapper Wrap page in a div with class. 458ab45ba71SJames Collins * @return string contents of page found 4592b4583abSJames Collins */ 4609cff245bSJames Collins public function includePage(string $page, bool $print = true, bool $parse = true, string $classWrapper = '') 4612b4583abSJames Collins { 462a8eebd82SJames Collins ob_start(); 463a8eebd82SJames Collins tpl_includeFile($page . '.html'); 464a8eebd82SJames Collins $html = ob_get_contents(); 465a8eebd82SJames Collins ob_end_clean(); 466a8eebd82SJames Collins 4673a385f2cSJames Collins if (empty($html) === true) { 468a8eebd82SJames Collins $useACL = $this->getConf('includePageUseACL'); 469a8eebd82SJames Collins $propagate = $this->getConf('includePagePropagate'); 470ab45ba71SJames Collins $html = ''; 4712b4583abSJames Collins 472ab45ba71SJames Collins $html = tpl_include_page($page, false, $propagate, $useACL); 473ab45ba71SJames Collins } 4742b4583abSJames Collins 4753a385f2cSJames Collins if (empty($html) === false && $parse === true) { 476ab45ba71SJames Collins $html = $this->parseContent($html); 477ab45ba71SJames Collins } 4782b4583abSJames Collins 4793a385f2cSJames Collins if (empty($classWrapper) === false && empty($html) === false) { 4809cff245bSJames Collins $html = '<div class="' . $classWrapper . '">' . $html . '</div>'; 4819cff245bSJames Collins } 4822b4583abSJames Collins 4839cff245bSJames Collins if ($print === true) { 4849cff245bSJames Collins echo $html; 4859cff245bSJames Collins } 486ab45ba71SJames Collins return $html; 4872b4583abSJames Collins } 4882b4583abSJames Collins 489a8eebd82SJames Collins 490a8eebd82SJames Collins /** 491a8eebd82SJames Collins * Print or return logged in user information 492a8eebd82SJames Collins * 4939cff245bSJames Collins * @param boolean $print Print content. 494a8eebd82SJames Collins * @return string user information 495a8eebd82SJames Collins */ 4969cff245bSJames Collins public function includeLoggedIn(bool $print = true) 49710b40067Snomadjimbob { 498a8eebd82SJames Collins $html = ''; 499a8eebd82SJames Collins 5009cff245bSJames Collins if (empty($_SERVER['REMOTE_USER']) === false) { 501a8eebd82SJames Collins $html .= '<div class="mikio-user-info">'; 502a8eebd82SJames Collins ob_start(); 503a8eebd82SJames Collins tpl_userinfo(); 504a8eebd82SJames Collins $html .= ob_get_contents(); 505a8eebd82SJames Collins ob_end_clean(); 506a8eebd82SJames Collins $html .= '</div>'; 5072b4583abSJames Collins } 508a8eebd82SJames Collins 5099cff245bSJames Collins if ($print === true) { 5109cff245bSJames Collins echo $html; 5119cff245bSJames Collins } 512a8eebd82SJames Collins return $html; 5132b4583abSJames Collins } 5142b4583abSJames Collins 5152b4583abSJames Collins 516a8eebd82SJames Collins /** 517a8eebd82SJames Collins * Print or return DokuWiki Menu 518a8eebd82SJames Collins * 5199cff245bSJames Collins * @param boolean $print Print content. 520a8eebd82SJames Collins * @return string contents of the menu 521a8eebd82SJames Collins */ 5229cff245bSJames Collins public function includeDWMenu(bool $print = true) 52310b40067Snomadjimbob { 5242b4583abSJames Collins global $lang; 5252b4583abSJames Collins global $USERINFO; 526c165b184SJames Collins 5279cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 528a8eebd82SJames Collins $html = '<ul class="mikio-nav">'; 5292b4583abSJames Collins 530ab45ba71SJames Collins $pageToolsMenu = []; 531ab45ba71SJames Collins $siteToolsMenu = []; 532ab45ba71SJames Collins $userToolsMenu = []; 533c165b184SJames Collins 534ab45ba71SJames Collins $showIcons = ($this->getConf('navbarDWMenuType') != 'text'); 535ab45ba71SJames Collins $showText = ($this->getConf('navbarDWMenuType') != 'icons'); 536ab45ba71SJames Collins $isDropDown = ($this->getConf('navbarDWMenuCombine') != 'seperate'); 5372b4583abSJames Collins 5382b4583abSJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 5392b4583abSJames Collins foreach ($items as $item) { 5409cff245bSJames Collins if ($item->getType() !== 'top') { 541ab45ba71SJames Collins $itemHtml = ''; 5422b4583abSJames Collins 543905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5449cff245bSJames Collins if ( 5453a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 5463a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 5473a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5489cff245bSJames Collins ) { 5499cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . 5509cff245bSJames Collins ' ' . $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 5519cff245bSJames Collins if ($showIcons === true) { 5529cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 5539cff245bSJames Collins } 5549cff245bSJames Collins if ($showText === true || $isDropDown === true) { 5559cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 5569cff245bSJames Collins } 557ab45ba71SJames Collins $itemHtml .= '</a>'; 558ab45ba71SJames Collins 559ab45ba71SJames Collins $pageToolsMenu[] = $itemHtml; 5602b4583abSJames Collins } 5619cff245bSJames Collins }//end if 5629cff245bSJames Collins }//end foreach 5632b4583abSJames Collins 564ab45ba71SJames Collins $items = (new \dokuwiki\Menu\SiteMenu())->getItems('action'); 565ab45ba71SJames Collins foreach ($items as $item) { 566ab45ba71SJames Collins $itemHtml = ''; 5672b4583abSJames Collins 568905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5699cff245bSJames Collins if ( 5703a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 5713a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 5723a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5739cff245bSJames Collins ) { 5749cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link ' . ($isDropDown === true ? 'mikio-dropdown-item' : '') . ' ' . 5759cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 5769cff245bSJames Collins if ($showIcons === true) { 5779cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 5789cff245bSJames Collins } 5799cff245bSJames Collins if ($showText === true || $isDropDown === true) { 5809cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 5819cff245bSJames Collins } 582ab45ba71SJames Collins $itemHtml .= '</a>'; 5832b4583abSJames Collins 584ab45ba71SJames Collins $siteToolsMenu[] = $itemHtml; 5852b4583abSJames Collins } 5869cff245bSJames Collins }//end foreach 5872b4583abSJames Collins 588ab45ba71SJames Collins $items = (new \dokuwiki\Menu\UserMenu())->getItems('action'); 589ab45ba71SJames Collins foreach ($items as $item) { 590ab45ba71SJames Collins $itemHtml = ''; 591ab45ba71SJames Collins 592905b27c6SJames Collins $showItem = $this->getConf('navbarItemShow' . ucfirst($item->getType())); 5939cff245bSJames Collins if ( 5943a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 5953a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 5963a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === false)) 5979cff245bSJames Collins ) { 5989cff245bSJames Collins $itemHtml .= '<a class="mikio-nav-link' . ($isDropDown === true ? ' mikio-dropdown-item' : '') . ' ' . 5999cff245bSJames Collins $item->getType() . '" href="' . $item->getLink() . '" title="' . $item->getTitle() . '">'; 6009cff245bSJames Collins if ($showIcons === true) { 6019cff245bSJames Collins $itemHtml .= '<span class="mikio-icon">' . inlineSVG($item->getSvg()) . '</span>'; 6029cff245bSJames Collins } 6039cff245bSJames Collins if ($showText === true || $isDropDown === true) { 6049cff245bSJames Collins $itemHtml .= '<span>' . $item->getLabel() . '</span>'; 6059cff245bSJames Collins } 606ab45ba71SJames Collins $itemHtml .= '</a>'; 607ab45ba71SJames Collins 608ab45ba71SJames Collins $userToolsMenu[] = $itemHtml; 609ab45ba71SJames Collins } 6109cff245bSJames Collins }//end foreach 611ab45ba71SJames Collins 612ab45ba71SJames Collins 613ab45ba71SJames Collins switch ($this->getConf('navbarDWMenuCombine')) { 614ab45ba71SJames Collins case 'dropdown': 615ab45ba71SJames Collins $html .= '<li id="dokuwiki__pagetools" class="mikio-nav-dropdown">'; 6169cff245bSJames Collins $html .= '<a id="mikio_dropdown_pagetools" class="nav-link dropdown-toggle" href="#" role="button" 6179cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6189cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('file') : '') . 6199cff245bSJames Collins ($showText === true ? $lang['page_tools'] : '<span class="mikio-small-only">' . $lang['page_tools'] . 6209cff245bSJames Collins '</span>') . '</a>'; 621a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 622ab45ba71SJames Collins 623ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 624ab45ba71SJames Collins $html .= $item; 625ab45ba71SJames Collins } 626ab45ba71SJames Collins 627ab45ba71SJames Collins $html .= '</div>'; 628ab45ba71SJames Collins $html .= '</li>'; 629ab45ba71SJames Collins 630a8eebd82SJames Collins $html .= '<li id="dokuwiki__sitetools" class="mikio-nav-dropdown">'; 6319cff245bSJames Collins $html .= '<a id="mikio_dropdown_sitetools" class="nav-link dropdown-toggle" href="#" role="button" 6329cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6339cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('gear') : '') . 6349cff245bSJames Collins ($showText === true ? $lang['site_tools'] : '<span class="mikio-small-only">' . 6359cff245bSJames Collins $lang['site_tools'] . '</span>') . '</a>'; 636a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 637ab45ba71SJames Collins 638ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 639ab45ba71SJames Collins $html .= $item; 640ab45ba71SJames Collins } 641ab45ba71SJames Collins 642ab45ba71SJames Collins $html .= '</div>'; 643ab45ba71SJames Collins $html .= '</li>'; 644ab45ba71SJames Collins 645a8eebd82SJames Collins $html .= '<li id="dokuwiki__usertools" class="mikio-nav-dropdown">'; 6469cff245bSJames Collins $html .= '<a id="mikio_dropdown_usertools" class="nav-link dropdown-toggle" href="#" role="button" 6479cff245bSJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 6489cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('user') : '') . 6499cff245bSJames Collins ($showText === true ? $lang['user_tools'] : '<span class="mikio-small-only">' . 6509cff245bSJames Collins $lang['user_tools'] . '</span>') . '</a>'; 651a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 652ab45ba71SJames Collins 653ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 654ab45ba71SJames Collins $html .= $item; 655ab45ba71SJames Collins } 656ab45ba71SJames Collins 657ab45ba71SJames Collins $html .= '</div>'; 658ab45ba71SJames Collins $html .= '</li>'; 659ab45ba71SJames Collins 660ab45ba71SJames Collins break; 661ab45ba71SJames Collins 662ab45ba71SJames Collins case 'combine': 663ab45ba71SJames Collins $html .= '<li class="mikio-nav-dropdown">'; 6649cff245bSJames Collins $html .= '<a class="mikio-nav-link" href="#">' . 6659cff245bSJames Collins ($showIcons === true ? $this->mikioInlineIcon('wrench') : '') . 6669cff245bSJames Collins ($showText === true ? tpl_getLang('tools-menu') : '<span class="mikio-small-only">' . 6679cff245bSJames Collins tpl_getLang('tools-menu') . '</span>') . '</a>'; 668a8eebd82SJames Collins $html .= '<div class="mikio-dropdown closed">'; 669ab45ba71SJames Collins 670ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['page_tools'] . '</h6>'; 671ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 672ab45ba71SJames Collins $html .= $item; 673ab45ba71SJames Collins } 674ab45ba71SJames Collins 675ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 676ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['site_tools'] . '</h6>'; 677ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 678ab45ba71SJames Collins $html .= $item; 679ab45ba71SJames Collins } 680ab45ba71SJames Collins 681ab45ba71SJames Collins $html .= '<div class="mikio-dropdown-divider"></div>'; 682ab45ba71SJames Collins $html .= '<h6 class="mikio-dropdown-header">' . $lang['user_tools'] . '</h6>'; 683ab45ba71SJames Collins foreach ($userToolsMenu as $item) { 684ab45ba71SJames Collins $html .= $item; 685ab45ba71SJames Collins } 686ab45ba71SJames Collins 687ab45ba71SJames Collins $html .= '</div>'; 688ab45ba71SJames Collins $html .= '</li>'; 689ab45ba71SJames Collins break; 690ab45ba71SJames Collins 691ab45ba71SJames Collins default: // seperate 692ab45ba71SJames Collins foreach ($siteToolsMenu as $item) { 693a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 694ab45ba71SJames Collins } 695ab45ba71SJames Collins 696ab45ba71SJames Collins foreach ($pageToolsMenu as $item) { 697a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 698a8eebd82SJames Collins } 699a8eebd82SJames Collins 700a8eebd82SJames Collins foreach ($userToolsMenu as $item) { 701a8eebd82SJames Collins $html .= '<li class="mikio-nav-item">' . $item . '</li>'; 702ab45ba71SJames Collins } 703ab45ba71SJames Collins 704ab45ba71SJames Collins break; 7059cff245bSJames Collins }//end switch 706ab45ba71SJames Collins 707*3a3ece10SJames Collins $translation = plugin_load('helper', 'translation'); 708*3a3ece10SJames Collins if ($translation !== null) { 709*3a3ece10SJames Collins $html .= '<li id="mikio__translate" class="mikio-nav-dropdown">'; 710*3a3ece10SJames Collins $html .= '<a id="mikio_dropdown_translate" class="nav-link dropdown-toggle" href="#" role="button" 711*3a3ece10SJames Collinsdata-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . 712*3a3ece10SJames Collins $this->mikioInlineIcon('language') . 713*3a3ece10SJames Collins '</a>'; 714*3a3ece10SJames Collins $html .= '<div class="mikio-dropdown closed">'; 715*3a3ece10SJames Collins 716*3a3ece10SJames Collins $html .= $translation->showTranslations(); 717*3a3ece10SJames Collins 718*3a3ece10SJames Collins $html .= '</div>'; 719*3a3ece10SJames Collins $html .= '</li>'; 720*3a3ece10SJames Collins } 721*3a3ece10SJames Collins 72212030b10SJames Collins if ($this->getConf('showLightDark') === true) { 723d0fba6d1SJames Collins $autoLightDark = $this->getConf('autoLightDark'); 7249e41d878SJames Collins $html .= '<li class="mikio-darklight"> 7259e41d878SJames Collins<a href="#" class="mikio-control mikio-button mikio-darklight-button">' . 726d0fba6d1SJames Collins ($autoLightDark === true ? $this->mikioInlineIcon('sunmoon', 'mikio-darklight-auto') : '') . 7279e41d878SJames Collins $this->mikioInlineIcon('sun', 'mikio-darklight-light') . 7289e41d878SJames Collins $this->mikioInlineIcon('moon', 'mikio-darklight-dark') . 7299e41d878SJames Collins '</a></li>'; 73012030b10SJames Collins } 73112030b10SJames Collins 732ab45ba71SJames Collins $html .= '</ul>'; 733ab45ba71SJames Collins 7349cff245bSJames Collins if ($print === true) { 7359cff245bSJames Collins echo $html; 7369cff245bSJames Collins } 737a8eebd82SJames Collins return $html; 738a8eebd82SJames Collins } 739a8eebd82SJames Collins 740a8eebd82SJames Collins 741a8eebd82SJames Collins /** 742a8eebd82SJames Collins * Create a nav element from a string. <uri>|<title>; 743a8eebd82SJames Collins * 7449cff245bSJames Collins * @param string $str String to generate nav. 745a8eebd82SJames Collins * @return string nav elements generated 746a8eebd82SJames Collins */ 7479cff245bSJames Collins public function stringToNav(string $str) 74810b40067Snomadjimbob { 749a8eebd82SJames Collins $html = ''; 750a8eebd82SJames Collins 7513a385f2cSJames Collins if (empty($str) === false) { 752a8eebd82SJames Collins $items = explode(';', $str); 753a8eebd82SJames Collins if (count($items) > 0) { 754a8eebd82SJames Collins $html .= '<ul class="mikio-nav">'; 755a8eebd82SJames Collins foreach ($items as $item) { 756a8eebd82SJames Collins $parts = explode('|', $item); 757a8eebd82SJames Collins if ($parts > 1) { 7589cff245bSJames Collins $html .= '<li class="mikio-nav-item"><a class="mikio-nav-link" href="' . 7599cff245bSJames Collins strip_tags($this->getLink(trim($parts[0]))) . '">' . strip_tags(trim($parts[1])) . 7609cff245bSJames Collins '</a></li>'; 761a8eebd82SJames Collins } 762a8eebd82SJames Collins } 763a8eebd82SJames Collins $html .= '</ul>'; 764a8eebd82SJames Collins } 7652b4583abSJames Collins } 7662b4583abSJames Collins 767ab45ba71SJames Collins return $html; 7682b4583abSJames Collins } 7692b4583abSJames Collins 770a8eebd82SJames Collins /** 771ab45ba71SJames Collins * print or return the main navbar 7722b4583abSJames Collins * 7739cff245bSJames Collins * @param boolean $print Print the navbar. 7749cff245bSJames Collins * @param boolean $showSub Include the sub navbar. 775ab45ba71SJames Collins * @return string generated content 7762b4583abSJames Collins */ 7779cff245bSJames Collins public function includeNavbar(bool $print = true, bool $showSub = false) 77810b40067Snomadjimbob { 779b39ad16dSJames Collins global $conf, $USERINFO; 780d3d7d2b7SJames Collins 781d3d7d2b7SJames Collins $homeUrl = wl(); 782d3d7d2b7SJames Collins 7839cff245bSJames Collins if (plugin_isdisabled('showpageafterlogin') === false) { 784d3d7d2b7SJames Collins $p = &plugin_load('action', 'showpageafterlogin'); 7853a385f2cSJames Collins if (empty($p) === false) { 7869cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 787d3d7d2b7SJames Collins $homeUrl = wl($p->getConf('page_after_login')); 788d3d7d2b7SJames Collins } 789d3d7d2b7SJames Collins } 790b39ad16dSJames Collins } else { 7919cff245bSJames Collins if (is_array($USERINFO) === true && count($USERINFO) > 0) { 792b39ad16dSJames Collins $url = $this->getConf('brandURLUser'); 793b39ad16dSJames Collins if (strlen($url) > 0) { 794b39ad16dSJames Collins $homeUrl = $url; 795d3d7d2b7SJames Collins } 796b39ad16dSJames Collins } else { 797b39ad16dSJames Collins $url = $this->getConf('brandURLGuest'); 798b39ad16dSJames Collins if (strlen($url) > 0) { 799b39ad16dSJames Collins $homeUrl = $url; 800b39ad16dSJames Collins } 801b39ad16dSJames Collins } 802b39ad16dSJames Collins } 803d3d7d2b7SJames Collins 804ab45ba71SJames Collins $html = ''; 80547161538SJames Collins 8069cff245bSJames Collins $html .= '<nav class="mikio-navbar' . (($this->getConf('stickyNavbar') === true) ? ' mikio-sticky' : '') . 8079cff245bSJames Collins '">'; 808f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 809d3d7d2b7SJames Collins $html .= '<a class="mikio-navbar-brand" href="' . $homeUrl . '">'; 8109cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true || $this->getConf('navbarUseTitleText') === true) { 811ab45ba71SJames Collins // Brand image 8129cff245bSJames Collins if ($this->getConf('navbarUseTitleIcon') === true) { 8139cff245bSJames Collins $logo = $this->getMediaFile('logo', false); 8149cff245bSJames Collins ; 8153a385f2cSJames Collins if (empty($logo) === false) { 816f0241fc4SJames Collins $width = $this->getConf('navbarTitleIconWidth'); 817f0241fc4SJames Collins $height = $this->getConf('navbarTitleIconHeight'); 818f0241fc4SJames Collins $styles = ''; 819f0241fc4SJames Collins 820f0241fc4SJames Collins if (strlen($width) > 0 || strlen($height) > 0) { 8219cff245bSJames Collins if (ctype_digit($width) === true) { 822f0241fc4SJames Collins $styles .= 'max-width:' . intval($width) . 'px;'; 8239cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $width) === 1) { 824f0241fc4SJames Collins $styles .= 'max-width:' . $width . ';'; 8259cff245bSJames Collins } elseif (strcasecmp($width, 'none') === 0) { 8267a92c19bSJames Collins $styles .= 'max-width:none;'; 827f0241fc4SJames Collins } 828f0241fc4SJames Collins 8299cff245bSJames Collins if (ctype_digit($height) === true) { 830f0241fc4SJames Collins $styles .= 'max-height:' . intval($height) . 'px;'; 8319cff245bSJames Collins } elseif (preg_match('/^\d+(px|rem|em|%)$/', $height) === 1) { 832f0241fc4SJames Collins $styles .= 'max-height:' . $height . ';'; 8339cff245bSJames Collins } elseif (strcasecmp($height, 'none') === 0) { 8347a92c19bSJames Collins $styles .= 'max-height:none;'; 835f0241fc4SJames Collins } 836f0241fc4SJames Collins 837f0241fc4SJames Collins if (strlen($styles) > 0) { 838f0241fc4SJames Collins $styles = ' style="' . $styles . '"'; 839f0241fc4SJames Collins } 8409cff245bSJames Collins }//end if 841f0241fc4SJames Collins 842f0241fc4SJames Collins $html .= '<img src="' . $logo . '" class="mikio-navbar-brand-image"' . $styles . '>'; 8439cff245bSJames Collins }//end if 8449cff245bSJames Collins }//end if 845ab45ba71SJames Collins 846ab45ba71SJames Collins // Brand title 8479cff245bSJames Collins if ($this->getConf('navbarUseTitleText') === true) { 848ab45ba71SJames Collins $html .= '<div class="mikio-navbar-brand-title">'; 849a8eebd82SJames Collins $html .= '<h1 class="mikio-navbar-brand-title-text">' . $conf['title'] . '</h1>'; 8509cff245bSJames Collins if ($this->getConf('navbarUseTaglineText') === true) { 851a8eebd82SJames Collins $html .= '<p class="claim mikio-navbar-brand-title-tagline">' . $conf['tagline'] . '</p>'; 852ab45ba71SJames Collins } 853ab45ba71SJames Collins $html .= '</div>'; 854ab45ba71SJames Collins } 8559cff245bSJames Collins }//end if 856ab45ba71SJames Collins $html .= '</a>'; 857660b2c71SJames Collins $html .= '<div class="mikio-navbar-toggle"><span class="icon"></span></div>'; 858ab45ba71SJames Collins 859ab45ba71SJames Collins // Menus 860ab45ba71SJames Collins $html .= '<div class="mikio-navbar-collapse">'; 861ab45ba71SJames Collins 8629cff245bSJames Collins $menus = [$this->getConf('navbarPosLeft', 'none'), $this->getConf('navbarPosMiddle', 'none'), 8639cff245bSJames Collins $this->getConf('navbarPosRight', 'none') 8649cff245bSJames Collins ]; 865a8eebd82SJames Collins foreach ($menus as $menuType) { 866a8eebd82SJames Collins switch ($menuType) { 867a8eebd82SJames Collins case 'custom': 868a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('navbarCustomMenuText', '')); 869a8eebd82SJames Collins break; 870a8eebd82SJames Collins case 'search': 871ab45ba71SJames Collins $html .= '<div class="mikio-nav-item">'; 872ab45ba71SJames Collins $html .= $this->includeSearch(false); 873ab45ba71SJames Collins $html .= '</div>'; 874a8eebd82SJames Collins break; 875a8eebd82SJames Collins case 'dokuwiki': 8769cff245bSJames Collins $html .= $this->includeDWMenu(false); 877a8eebd82SJames Collins break; 878a8eebd82SJames Collins } 879a8eebd82SJames Collins } 880ab45ba71SJames Collins 881ab45ba71SJames Collins $html .= '</div>'; 882f8039bf2SJames Collins $html .= '</div>'; 883ab45ba71SJames Collins $html .= '</nav>'; 884ab45ba71SJames Collins 885a8eebd82SJames Collins // Sub Navbar 8869cff245bSJames Collins if ($showSub === true) { 8879cff245bSJames Collins $sub = $this->includePage('submenu', false); 8883a385f2cSJames Collins if (empty($sub) === false) { 8899cff245bSJames Collins $html .= '<nav class="mikio-navbar mikio-sub-navbar">' . $sub . '</nav>'; 8909cff245bSJames Collins } 891ab45ba71SJames Collins } 892ab45ba71SJames Collins 8939cff245bSJames Collins if ($print === true) { 8949cff245bSJames Collins echo $html; 8959cff245bSJames Collins } 896ab45ba71SJames Collins return $html; 897ab45ba71SJames Collins } 898ab45ba71SJames Collins 899ab45ba71SJames Collins 900a8eebd82SJames Collins /** 901a8eebd82SJames Collins * Is there a sidebar 902a8eebd82SJames Collins * 9039cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 904a8eebd82SJames Collins * @return boolean if sidebar exists 905a8eebd82SJames Collins */ 9069cff245bSJames Collins public function sidebarExists(string $prefix = '') 90710b40067Snomadjimbob { 908a8eebd82SJames Collins global $conf; 909a8eebd82SJames Collins 9103a385f2cSJames Collins if (strcasecmp($prefix, 'left') === 0) { 9119cff245bSJames Collins $prefix = ''; 9129cff245bSJames Collins } 913a8eebd82SJames Collins 914a8eebd82SJames Collins return $this->pageExists($conf['sidebar' . $prefix]); 915a8eebd82SJames Collins } 916a8eebd82SJames Collins 917a8eebd82SJames Collins 918a8eebd82SJames Collins /** 919ab45ba71SJames Collins * Print or return the sidebar content 920ab45ba71SJames Collins * 9219cff245bSJames Collins * @param string $prefix Sidebar prefix to use when searching. 9229cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 9239cff245bSJames Collins * @param boolean $parse Parse the content. 924ab45ba71SJames Collins * @return string generated content 925ab45ba71SJames Collins */ 9269cff245bSJames Collins public function includeSidebar(string $prefix = '', bool $print = true, bool $parse = true) 92710b40067Snomadjimbob { 928ab45ba71SJames Collins global $conf, $ID; 929ab45ba71SJames Collins 930ab45ba71SJames Collins $html = ''; 931ab45ba71SJames Collins $confPrefix = preg_replace('/[^a-zA-Z0-9]/', '', ucwords($prefix)); 932ab45ba71SJames Collins $prefix = preg_replace('/[^a-zA-Z0-9]/', '', strtolower($prefix)); 933ab45ba71SJames Collins 9343a385f2cSJames Collins if (empty($confPrefix) === true) { 9359cff245bSJames Collins $confPrefix = 'Left'; 9369cff245bSJames Collins } 9371cdedf28SJames Collins if (strcasecmp($prefix, 'left') === 0) { 9389cff245bSJames Collins $prefix = ''; 9399cff245bSJames Collins } 940ab45ba71SJames Collins 9411cdedf28SJames Collins $sidebarPage = empty($conf[$prefix . 'sidebar']) === true ? $prefix . 'sidebar' : $conf[$prefix . 'sidebar']; 942ab45ba71SJames Collins 9439cff245bSJames Collins if ( 9449cff245bSJames Collins $this->getConf('sidebarShow' . $confPrefix) === true && page_findnearest($sidebarPage) !== false && 9451cdedf28SJames Collins p_get_metadata($ID, 'nosidebar', false) === null 9469cff245bSJames Collins ) { 9479cff245bSJames Collins $content = $this->includePage($sidebarPage . 'header', false); 9483a385f2cSJames Collins if (empty($content) === false) { 9499cff245bSJames Collins $html .= '<div class="mikio-sidebar-header">' . $content . '</div>'; 9509cff245bSJames Collins } 951ab45ba71SJames Collins 9523a385f2cSJames Collins if (empty($prefix) === true) { 9539cff245bSJames Collins $rows = [$this->getConf('sidebarLeftRow1'), $this->getConf('sidebarLeftRow2'), 9549cff245bSJames Collins $this->getConf('sidebarLeftRow3'), $this->getConf('sidebarLeftRow4') 9559cff245bSJames Collins ]; 956ab45ba71SJames Collins 957a8eebd82SJames Collins foreach ($rows as $row) { 958a8eebd82SJames Collins switch ($row) { 959a8eebd82SJames Collins case 'search': 9609cff245bSJames Collins $html .= $this->includeSearch(false); 961a8eebd82SJames Collins break; 962a8eebd82SJames Collins case 'logged in user': 9639cff245bSJames Collins $html .= $this->includeLoggedIn(false); 964a8eebd82SJames Collins break; 965a8eebd82SJames Collins case 'content': 9669cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 9673a385f2cSJames Collins if (empty($content) === false) { 9689cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 9699cff245bSJames Collins } 970a8eebd82SJames Collins break; 971a8eebd82SJames Collins case 'tags': 972a8eebd82SJames Collins $html .= '<div class="mikio-tags"></div>'; 973a8eebd82SJames Collins } 974a8eebd82SJames Collins } 975a8eebd82SJames Collins } else { 9769cff245bSJames Collins $content = $this->includePage($sidebarPage, false); 9773a385f2cSJames Collins if (empty($content) === false) { 9789cff245bSJames Collins $html .= '<div class="mikio-sidebar-content">' . $content . '</div>'; 9799cff245bSJames Collins } 9809cff245bSJames Collins }//end if 9819cff245bSJames Collins 9829cff245bSJames Collins $content = $this->includePage($sidebarPage . 'footer', false); 9833a385f2cSJames Collins if (empty($content) === false) { 9849cff245bSJames Collins $html .= '<div class="mikio-sidebar-footer">' . $content . '</div>'; 9859cff245bSJames Collins } 9869cff245bSJames Collins }//end if 9879cff245bSJames Collins 9883a385f2cSJames Collins if (empty($html) === true) { 9893a385f2cSJames Collins if (empty($prefix) === true && $this->getConf('sidebarAlwaysShowLeft') === true) { 9909cff245bSJames Collins $html = ' '; 9919cff245bSJames Collins } 9929cff245bSJames Collins if ($this->getConf('sidebarAlwaysShow' . ucfirst($prefix)) === true) { 9939cff245bSJames Collins $html = ' '; 9949cff245bSJames Collins } 995a8eebd82SJames Collins } 996ab45ba71SJames Collins 9973a385f2cSJames Collins if (empty($html) === false) { 9981cdedf28SJames Collins $html = '<aside class="mikio-sidebar mikio-sidebar-' . (empty($prefix) === true ? 'left' : $prefix) . 9999cff245bSJames Collins '"><a class="mikio-sidebar-toggle' . 10009cff245bSJames Collins ($this->getConf('sidebarMobileDefaultCollapse') === true ? ' closed' : '') . '" href="#">' . 10019cff245bSJames Collins tpl_getLang('sidebar-title') . ' <span class="icon"></span></a><div class="mikio-sidebar-collapse">' . 10029cff245bSJames Collins $html . '</div></aside>'; 1003ab45ba71SJames Collins } 1004ab45ba71SJames Collins 10059cff245bSJames Collins if ($parse === true) { 10069cff245bSJames Collins $html = $this->includeIcons($html); 10073a04a100SJames Collins } 10089cff245bSJames Collins if ($print === true) { 10099cff245bSJames Collins echo $html; 1010ab45ba71SJames Collins } 1011ab45ba71SJames Collins return $html; 1012ab45ba71SJames Collins } 1013ab45ba71SJames Collins 1014ab45ba71SJames Collins 1015a8eebd82SJames Collins /** 1016ab45ba71SJames Collins * Print or return the page tools content 1017ab45ba71SJames Collins * 10189cff245bSJames Collins * @param boolean $print Print the generated content to the output buffer. 10199cff245bSJames Collins * @param boolean $includeId Include the dw__pagetools id in the element. 1020ab45ba71SJames Collins * @return string generated content 1021ab45ba71SJames Collins */ 10229cff245bSJames Collins public function includePageTools(bool $print = true, bool $includeId = false) 102310b40067Snomadjimbob { 10241293ce10SJames Collins global $USERINFO; 10251293ce10SJames Collins 10269cff245bSJames Collins $loggedIn = (is_array($USERINFO) === true && count($USERINFO) > 0); 1027ab45ba71SJames Collins $html = ''; 1028ab45ba71SJames Collins 10299cff245bSJames Collins $html .= '<nav' . ($includeId === true ? ' id="dw__pagetools"' : '') . ' class="hidden-print dw__pagetools">'; 1030b9c0582bSJames Collins $html .= '<ul class="tools">'; 1031ab45ba71SJames Collins 1032ab45ba71SJames Collins $items = (new \dokuwiki\Menu\PageMenu())->getItems(); 1033ab45ba71SJames Collins foreach ($items as $item) { 10349cff245bSJames Collins $classes = []; 10353fd763a0SJames Collins $classes[] = $item->getType(); 10363fd763a0SJames Collins $attr = $item->getLinkAttributes(); 10373fd763a0SJames Collins 10389cff245bSJames Collins if (empty($attr['class']) === false) { 10393fd763a0SJames Collins $classes = array_merge($classes, explode(' ', $attr['class'])); 1040ab45ba71SJames Collins } 1041ab45ba71SJames Collins 10423fd763a0SJames Collins $classes = array_unique($classes); 10433fd763a0SJames Collins 10441293ce10SJames Collins $showItem = $this->getConf('pageToolsShow' . ucfirst($item->getType())); 10459cff245bSJames Collins if ( 10463a385f2cSJames Collins $showItem !== false && (strcasecmp($showItem, 'always') === 0 || 10473a385f2cSJames Collins (strcasecmp($showItem, 'logged in') === 0 && $loggedIn === true) || 10483a385f2cSJames Collins (strcasecmp($showItem, 'logged out') === 0 && $loggedIn === true)) 10499cff245bSJames Collins ) { 10503fd763a0SJames Collins $html .= '<li class="' . implode(' ', $classes) . '">'; 10519cff245bSJames Collins $html .= '<a href="' . $item->getLink() . '" class="' . $item->getType() . '" title="' . 10529cff245bSJames Collins $item->getTitle() . '"><div class="icon">' . inlineSVG($item->getSvg()) . 10539cff245bSJames Collins '</div><span class="a11y">' . $item->getLabel() . '</span></a>'; 10543fd763a0SJames Collins $html .= '</li>'; 10553fd763a0SJames Collins } 10569cff245bSJames Collins }//end foreach 10573fd763a0SJames Collins 10583fd763a0SJames Collins $html .= '</ul>'; 1059ab45ba71SJames Collins $html .= '</nav>'; 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 the search bar 1070a8eebd82SJames Collins * 10719cff245bSJames Collins * @param boolean $print Print content. 1072a8eebd82SJames Collins * @return string contents of the search bar 1073a8eebd82SJames Collins */ 10749cff245bSJames Collins public function includeSearch(bool $print = true) 107510b40067Snomadjimbob { 10769cff245bSJames Collins global $lang, $ID, $ACT, $QUERY; 1077ab45ba71SJames Collins $html = ''; 1078ab45ba71SJames Collins 10799cff245bSJames Collins $html .= '<form class="mikio-search search" action="' . wl() . 10809cff245bSJames Collins '" accept-charset="utf-8" method="get" role="search">'; 1081a8eebd82SJames Collins $html .= '<input type="hidden" name="do" value="search">'; 1082a8eebd82SJames Collins $html .= '<input type="hidden" name="id" value="' . $ID . '">'; 1083c1cb9f15SChris MacMackin $html .= '<input name="q" '; 10849cff245bSJames Collins if ($this->getConf('searchUseTypeahead') === true) { 1085c1cb9f15SChris MacMackin $html .= 'class="search_typeahead" '; 1086c1cb9f15SChris MacMackin } 10879cff245bSJames Collins $html .= 'autocomplete="off" type="search" placeholder="' . $lang['btn_search'] . '" value="' . 10883a385f2cSJames Collins ((strcasecmp($ACT, 'search') === 0) ? htmlspecialchars($QUERY) : '') . '" accesskey="f" title="[F]" />'; 1089a8eebd82SJames Collins $html .= '<button type="submit" title="' . $lang['btn_search'] . '">'; 10903a385f2cSJames Collins if (strcasecmp($this->getConf('searchButton'), 'icon') === 0) { 1091a8eebd82SJames Collins $html .= $this->mikioInlineIcon('search'); 1092ab45ba71SJames Collins } else { 1093ab45ba71SJames Collins $html .= $lang['btn_search']; 1094ab45ba71SJames Collins } 1095ab45ba71SJames Collins $html .= '</button>'; 1096ab45ba71SJames Collins $html .= '</form>'; 1097ab45ba71SJames Collins 10989cff245bSJames Collins if ($print === true) { 10999cff245bSJames Collins echo $html; 11009cff245bSJames Collins } 1101ab45ba71SJames Collins return $html; 1102ab45ba71SJames Collins } 1103ab45ba71SJames Collins 1104ab45ba71SJames Collins 1105a8eebd82SJames Collins /** 1106a8eebd82SJames Collins * Print or return content 1107a8eebd82SJames Collins * 11089cff245bSJames Collins * @param boolean $print Print content. 1109a8eebd82SJames Collins * @return string contents 1110a8eebd82SJames Collins */ 11119cff245bSJames Collins public function includeContent(bool $print = true) 111210b40067Snomadjimbob { 1113ab45ba71SJames Collins ob_start(); 11149cff245bSJames Collins tpl_content(false); 1115ab45ba71SJames Collins $html = ob_get_contents(); 1116ab45ba71SJames Collins ob_end_clean(); 1117ab45ba71SJames Collins 1118ab45ba71SJames Collins $html = $this->includeIcons($html); 1119ab45ba71SJames Collins $html = $this->parseContent($html); 1120ab45ba71SJames Collins 1121ab45ba71SJames Collins $html .= '<div style="clear:both"></div>'; 1122ab45ba71SJames Collins 11239cff245bSJames Collins if ($this->getConf('heroTitle') === false) { 11249cff245bSJames Collins $html = '<div class="mikio-tags"></div>' . $html; 11259cff245bSJames Collins } 1126a8eebd82SJames Collins 1127a8eebd82SJames Collins $html = '<div class="mikio-article-content">' . $html . '</div>'; 1128a8eebd82SJames Collins 11299cff245bSJames Collins if ($print === true) { 11309cff245bSJames Collins echo $html; 11319cff245bSJames Collins } 1132ab45ba71SJames Collins return $html; 1133ab45ba71SJames Collins } 1134ab45ba71SJames Collins 1135a8eebd82SJames Collins /** 1136ab45ba71SJames Collins * Print or return footer 1137ab45ba71SJames Collins * 11389cff245bSJames Collins * @param boolean $print Print footer. 11399cff245bSJames Collins * @return string HTML string containing footer 1140ab45ba71SJames Collins */ 11419cff245bSJames Collins public function includeFooter(bool $print = true) 114210b40067Snomadjimbob { 1143ab45ba71SJames Collins global $ACT; 1144ab45ba71SJames Collins 1145ab45ba71SJames Collins $html = ''; 1146ab45ba71SJames Collins 1147ab45ba71SJames Collins $html .= '<footer class="mikio-footer">'; 11489cff245bSJames Collins $html .= '<div class="doc">' . tpl_pageinfo(true) . '</div>'; 11499cff245bSJames Collins $html .= $this->includePage('footer', false); 1150ab45ba71SJames Collins 1151a8eebd82SJames Collins $html .= $this->stringToNav($this->getConf('footerCustomMenuText')); 1152ab45ba71SJames Collins 11539cff245bSJames Collins if ($this->getConf('footerSearch') === true) { 1154ab45ba71SJames Collins $html .= '<div class="mikio-footer-search">'; 11559cff245bSJames Collins $html .= $this->includeSearch(false); 1156ab45ba71SJames Collins $html .= '</div>'; 1157ab45ba71SJames Collins } 1158ab45ba71SJames Collins 1159a8eebd82SJames Collins $showPageTools = $this->getConf('pageToolsFooter'); 11609cff245bSJames Collins if ( 11613a385f2cSJames Collins strcasecmp($ACT, 'show') === 0 && (strcasecmp($showPageTools, 'always') === 0 || 11623a385f2cSJames Collins $this->userCanEdit() === true && strcasecmp($showPageTools, 'page editors') === 0) 11639cff245bSJames Collins ) { 11649cff245bSJames Collins $html .= $this->includePageTools(false); 11659cff245bSJames Collins } 1166ab45ba71SJames Collins 11679cff245bSJames Collins $meta['licenseType'] = ['multichoice', '_choices' => ['none', 'badge', 'button']]; 11689cff245bSJames Collins $meta['licenseImageOnly'] = ['onoff']; 1169ab45ba71SJames Collins 1170ab45ba71SJames Collins $licenseType = $this->getConf('licenseType'); 11719cff245bSJames Collins if ($licenseType !== 'none') { 11729cff245bSJames Collins $html .= tpl_license($licenseType, $this->getConf('licenseImageOnly'), true, true); 1173ab45ba71SJames Collins } 1174ab45ba71SJames Collins 1175ab45ba71SJames Collins $html .= '</footer>'; 1176ab45ba71SJames Collins 11779cff245bSJames Collins if ($print === true) { 11789cff245bSJames Collins echo $html; 11799cff245bSJames Collins } 1180ab45ba71SJames Collins return $html; 1181ab45ba71SJames Collins } 1182ab45ba71SJames Collins 1183ab45ba71SJames Collins 1184a8eebd82SJames Collins /** 1185ab45ba71SJames Collins * Print or return breadcrumb trail 1186ab45ba71SJames Collins * 11879cff245bSJames Collins * @param boolean $print Print out trail. 11889cff245bSJames Collins * @param boolean $parse Parse trail before printing. 11899cff245bSJames Collins * @return string HTML string containing breadcrumbs 1190ab45ba71SJames Collins */ 11919cff245bSJames Collins public function includeBreadcrumbs(bool $print = true, bool $parse = true) 119210b40067Snomadjimbob { 1193a8eebd82SJames Collins global $conf, $ID, $lang, $ACT; 1194a8eebd82SJames Collins 11953a385f2cSJames Collins if ( 11963a385f2cSJames Collins $this->getConf('breadcrumbHideHome') === true && strcasecmp($ID, 'start') === 0 && 119795372bffSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['breadcrumbs'] === 0 11983a385f2cSJames Collins ) { 11999cff245bSJames Collins return ''; 12009cff245bSJames Collins } 1201ab45ba71SJames Collins 1202ab45ba71SJames Collins $html = '<div class="mikio-breadcrumbs">'; 1203f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 12043a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 120595372bffSJames Collins if ($conf['breadcrumbs'] !== 0) { 12069cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === false && $this->getConf('breadcrumbSep') === false) { 1207ab45ba71SJames Collins ob_start(); 120875adba86SJames Collins tpl_breadcrumbs(); 1209ab45ba71SJames Collins $html .= ob_get_contents(); 1210ab45ba71SJames Collins ob_end_clean(); 1211ab45ba71SJames Collins } else { 1212ab45ba71SJames Collins $sep = '•'; 1213ab45ba71SJames Collins $prefix = $lang['breadcrumb']; 1214ab45ba71SJames Collins 12159cff245bSJames Collins if ($this->getConf('breadcrumbSep') === true) { 1216ab45ba71SJames Collins $sep = $this->getConf('breadcrumbSepText'); 12179cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-sep', false); 1218ab45ba71SJames Collins 12199cff245bSJames Collins if ($img !== false) { 1220ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1221ab45ba71SJames Collins } 122247161538SJames Collins } 122347161538SJames Collins 12249cff245bSJames Collins if ($this->getConf('breadcrumbPrefix') === true) { 1225ab45ba71SJames Collins $prefix = $this->getConf('breadcrumbPrefixText'); 12269cff245bSJames Collins $img = $this->getMediaFile('breadcrumb-prefix', false); 1227ab45ba71SJames Collins 12289cff245bSJames Collins if ($img !== false) { 1229ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 1230ab45ba71SJames Collins } 1231ab45ba71SJames Collins } 1232ab45ba71SJames Collins 1233ab45ba71SJames Collins $crumbs = breadcrumbs(); 1234ab45ba71SJames Collins 1235ab45ba71SJames Collins $html .= '<ul>'; 12363a385f2cSJames Collins if (empty($prefix) === false) { 12379cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 12389cff245bSJames Collins } 1239ab45ba71SJames Collins 1240ab45ba71SJames Collins $last = count($crumbs); 1241ab45ba71SJames Collins $i = 0; 1242ab45ba71SJames Collins foreach ($crumbs as $id => $name) { 1243ab45ba71SJames Collins $i++; 124495372bffSJames Collins if ($i !== 1) { 1245ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 124695372bffSJames Collins } 12479cff245bSJames Collins $html .= '<li' . ($i === $last ? ' class="curid"' : '') . '>'; 12489cff245bSJames Collins $html .= tpl_pagelink($id, null, true); 1249ab45ba71SJames Collins $html .= '</li>'; 1250ab45ba71SJames Collins } 1251ab45ba71SJames Collins 1252ab45ba71SJames Collins $html .= '</ul>'; 12539cff245bSJames Collins }//end if 12549cff245bSJames Collins }//end if 12559cff245bSJames Collins }//end if 12563d11a778SJames Collins 12573d11a778SJames Collins $html .= '</div>'; 12583d11a778SJames Collins $html .= '</div>'; 12593d11a778SJames Collins 12609cff245bSJames Collins if ($parse === true) { 12619cff245bSJames Collins $html = $this->includeIcons($html); 12629cff245bSJames Collins } 12639cff245bSJames Collins if ($print === true) { 12649cff245bSJames Collins echo $html; 12659cff245bSJames Collins } 12663d11a778SJames Collins return $html; 12673d11a778SJames Collins } 12683d11a778SJames Collins 12693d11a778SJames Collins /** 12703d11a778SJames Collins * Print or return you are here trail 12713d11a778SJames Collins * 12729cff245bSJames Collins * @param boolean $print Print out trail. 12739cff245bSJames Collins * @param boolean $parse Parse trail before printing. 12749cff245bSJames Collins * @return string HTML string containing breadcrumbs 12753d11a778SJames Collins */ 12769cff245bSJames Collins public function includeYouAreHere(bool $print = true, bool $parse = true) 12773d11a778SJames Collins { 12783d11a778SJames Collins global $conf, $ID, $lang, $ACT; 12793d11a778SJames Collins 12803a385f2cSJames Collins if ( 12813a385f2cSJames Collins $this->getConf('youarehereHideHome') === true && strcasecmp($ID, 'start') === 0 && 128295372bffSJames Collins strcasecmp($ACT, 'show') === 0 || strcasecmp($ACT, 'showtag') === 0 || $conf['youarehere'] === 0 12833a385f2cSJames Collins ) { 12849cff245bSJames Collins return ''; 12859cff245bSJames Collins } 12863d11a778SJames Collins 12873d11a778SJames Collins $html = '<div class="mikio-youarehere">'; 12883d11a778SJames Collins $html .= '<div class="mikio-container">'; 12893a385f2cSJames Collins if (strcasecmp($ACT, 'show') === 0) { 129095372bffSJames Collins if ($conf['youarehere'] !== 0) { 12919cff245bSJames Collins if ($this->getConf('youareherePrefix') === false && $this->getConf('youarehereSep') === false) { 129295372bffSJames Collins $html .= '<div class="mikio-bcdw">'; 1293ab45ba71SJames Collins ob_start(); 129475adba86SJames Collins tpl_youarehere(); 1295ab45ba71SJames Collins $html .= ob_get_contents(); 1296ab45ba71SJames Collins ob_end_clean(); 129795372bffSJames Collins $html .= '</div>'; 1298ab45ba71SJames Collins } else { 1299ab45ba71SJames Collins $sep = ' » '; 1300ab45ba71SJames Collins $prefix = $lang['youarehere']; 1301ab45ba71SJames Collins 13029cff245bSJames Collins if ($this->getConf('youarehereSep') === true) { 13033d11a778SJames Collins $sep = $this->getConf('youarehereSepText'); 13049cff245bSJames Collins $img = $this->getMediaFile('youarehere-sep', false); 1305ab45ba71SJames Collins 13069cff245bSJames Collins if ($img !== false) { 1307ab45ba71SJames Collins $sep = '<img src="' . $img . '">'; 1308ab45ba71SJames Collins } 130975adba86SJames Collins } 131075adba86SJames Collins 13119cff245bSJames Collins if ($this->getConf('youareherePrefix') === true) { 13123d11a778SJames Collins $prefix = $this->getConf('youareherePrefixText'); 13139cff245bSJames Collins $img = $this->getMediaFile('youarehere-prefix', false); 1314ab45ba71SJames Collins 13159cff245bSJames Collins if ($img !== false) { 1316ab45ba71SJames Collins $prefix = '<img src="' . $img . '">'; 131775adba86SJames Collins } 131847161538SJames Collins } 131947161538SJames Collins 1320ab45ba71SJames Collins $html .= '<ul>'; 13213a385f2cSJames Collins if (empty($prefix) === false) { 13229cff245bSJames Collins $html .= '<li class="prefix">' . $prefix . '</li>'; 13239cff245bSJames Collins } 13249cff245bSJames Collins $html .= '<li>' . tpl_pagelink(':' . $conf['start'], null, true) . '</li>'; 1325ab45ba71SJames Collins 1326ab45ba71SJames Collins $parts = explode(':', $ID); 1327ab45ba71SJames Collins $count = count($parts); 1328ab45ba71SJames Collins 1329ab45ba71SJames Collins $part = ''; 13309cff245bSJames Collins for ($i = 0; $i < ($count - 1); $i++) { 1331ab45ba71SJames Collins $part .= $parts[$i] . ':'; 1332ab45ba71SJames Collins $page = $part; 13339cff245bSJames Collins if ($page === $conf['start']) { 13349cff245bSJames Collins continue; 13359cff245bSJames Collins } 1336ab45ba71SJames Collins 1337ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 13389cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1339ab45ba71SJames Collins } 1340ab45ba71SJames Collins 1341ab45ba71SJames Collins resolve_pageid('', $page, $exists); 13429cff245bSJames Collins if ((isset($page) === true && $page === $part . $parts[$i]) === false) { 1343ab45ba71SJames Collins $page = $part . $parts[$i]; 13449cff245bSJames Collins if ($page !== $conf['start']) { 1345ab45ba71SJames Collins $html .= '<li class="sep">' . $sep . '</li>'; 13469cff245bSJames Collins $html .= '<li>' . tpl_pagelink($page, null, true) . '</li>'; 1347ab45ba71SJames Collins } 1348ab45ba71SJames Collins } 1349ab45ba71SJames Collins 1350ab45ba71SJames Collins $html .= '</ul>'; 13519cff245bSJames Collins }//end if 13529cff245bSJames Collins }//end if 1353ab45ba71SJames Collins 13543d11a778SJames Collins $showLast = $this->getConf('youarehereShowLast'); 13559cff245bSJames Collins if ($showLast !== 0) { 1356a8eebd82SJames Collins preg_match_all('/(<li[^>]*>.+?<\/li>)/', $html, $matches); 13579cff245bSJames Collins if (count($matches) > 0 && count($matches[0]) > (($showLast * 2) + 2)) { 1358a8eebd82SJames Collins $count = count($matches[0]); 1359a8eebd82SJames Collins $list = ''; 1360a8eebd82SJames Collins 1361a8eebd82SJames Collins // Show Home 1362a8eebd82SJames Collins $list .= $matches[0][0] . $matches[0][1]; 1363a8eebd82SJames Collins 1364a8eebd82SJames Collins $list .= '<li>...</li>'; 13659cff245bSJames Collins for ($i = ($count - ($showLast * 2)); $i <= $count; $i++) { 1366a8eebd82SJames Collins $list .= $matches[0][$i]; 1367a8eebd82SJames Collins } 1368a8eebd82SJames Collins 1369a8eebd82SJames Collins $html = preg_replace('/<ul>.*<\/ul>/', '<ul>' . $list . '</ul>', $html); 1370a8eebd82SJames Collins } 1371a8eebd82SJames Collins } 1372a8eebd82SJames Collins 13733d11a778SJames Collins switch ($this->getConf('youarehereHome')) { 1374a8eebd82SJames Collins case 'none': 1375a8eebd82SJames Collins $html = preg_replace('/<li[^>]*>.+?<\/li>/', '', $html, 2); 1376a8eebd82SJames Collins break; 1377a8eebd82SJames Collins case 'home': 1378a8eebd82SJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . tpl_getlang('home') . '$3', $html, 1); 1379a8eebd82SJames Collins break; 1380a8eebd82SJames Collins case 'icon': 13819cff245bSJames Collins $html = preg_replace('/(<a[^>]*>)(.+?)(<\/a>)/', '$1' . 13829cff245bSJames Collins $this->mikioInlineIcon('home') . '$3', $html, 1); 1383a8eebd82SJames Collins break; 1384a8eebd82SJames Collins } 1385a8eebd82SJames Collins } else { 1386a8eebd82SJames Collins $html .= '≪ '; 13879cff245bSJames Collins if (isset($_GET['page']) === true) { 13889cff245bSJames Collins $html .= '<a href="' . wl($ID, ['do' => $ACT]) . '">Back</a> / '; 1389a8eebd82SJames Collins } 13904057121fSJames Collins $html .= '<a href="' . wl($ID) . '">View Page</a>'; 13919cff245bSJames Collins }//end if 13929cff245bSJames Collins 13939cff245bSJames Collins $html .= '</div>'; 13949cff245bSJames Collins $html .= '</div>'; 13959cff245bSJames Collins 13969cff245bSJames Collins if ($parse === true) { 13979cff245bSJames Collins $html = $this->includeIcons($html); 1398a8eebd82SJames Collins } 13999cff245bSJames Collins if ($print === true) { 14009cff245bSJames Collins echo $html; 14019cff245bSJames Collins } 1402ab45ba71SJames Collins return $html; 1403ab45ba71SJames Collins } 1404ab45ba71SJames Collins 14051785fc73SJames Collins /** 14061785fc73SJames Collins * Get Page Title 14079cff245bSJames Collins * 14089cff245bSJames Collins * @return string page title 14091785fc73SJames Collins */ 141010b40067Snomadjimbob public function parsePageTitle() 141110b40067Snomadjimbob { 14122060e56cSJames Collins global $ID; 14132060e56cSJames Collins 14142060e56cSJames Collins $title = p_get_first_heading($ID); 14159cff245bSJames Collins if (strlen($title) <= 0) { 14169cff245bSJames Collins $title = tpl_pagetitle(null, true); 14179cff245bSJames Collins } 14181785fc73SJames Collins $title = $this->includeIcons($title); 14191785fc73SJames Collins 14201785fc73SJames Collins return $title; 14211785fc73SJames Collins } 14221785fc73SJames Collins 1423ab45ba71SJames Collins 142475adba86SJames Collins /** 1425a8eebd82SJames Collins * Print or return hero block 142675adba86SJames Collins * 14279cff245bSJames Collins * @param boolean $print Print content. 1428a8eebd82SJames Collins * @return string contents of hero 142975adba86SJames Collins */ 14309cff245bSJames Collins public function includeHero(bool $print = true) 143110b40067Snomadjimbob { 1432a8eebd82SJames Collins $html = ''; 143347161538SJames Collins 14349cff245bSJames Collins if ($this->getConf('heroTitle') === true) { 1435a8eebd82SJames Collins $html .= '<div class="mikio-hero">'; 1436f8039bf2SJames Collins $html .= '<div class="mikio-container">'; 1437a8eebd82SJames Collins $html .= '<div class="mikio-hero-text">'; 14383a385f2cSJames Collins if (strcasecmp($this->getConf('youareherePosition'), 'hero') === 0) { 14399cff245bSJames Collins $html .= $this->includeYouAreHere(false); 14409cff245bSJames Collins } 14413a385f2cSJames Collins if (strcasecmp($this->getConf('breadcrumbPosition'), 'hero') === 0) { 14429cff245bSJames Collins $html .= $this->includeBreadcrumbs(false); 14439cff245bSJames Collins } 1444ab45ba71SJames Collins 1445a8eebd82SJames Collins $html .= '<h1 class="mikio-hero-title">'; 14461785fc73SJames Collins $html .= $this->parsePageTitle(); // No idea why this requires a blank space afterwards to work? 1447a8eebd82SJames Collins $html .= '</h1>'; 1448a8eebd82SJames Collins $html .= '<h2 class="mikio-hero-subtitle"></h2>'; 1449a8eebd82SJames Collins $html .= '</div>'; 145047161538SJames Collins 14519cff245bSJames Collins $hero_image = $this->getMediaFile('hero', true, $this->getConf('heroImagePropagation', true)); 1452a8eebd82SJames Collins $hero_image_resize_class = ''; 14533a385f2cSJames Collins if (empty($hero_image) === false) { 1454a8eebd82SJames Collins $hero_image = ' style="background-image:url(\'' . $hero_image . '\');"'; 1455a8eebd82SJames Collins $hero_image_resize_class = ' mikio-hero-image-resize'; 145647161538SJames Collins } 1457a8eebd82SJames Collins 14589cff245bSJames Collins $html .= '<div class="mikio-hero-image' . $hero_image_resize_class . '"' . $hero_image . 14599cff245bSJames Collins '><div class="mikio-tags"></div></div>'; 1460a8eebd82SJames Collins 1461a8eebd82SJames Collins $html .= '</div>'; 1462f8039bf2SJames Collins $html .= '</div>'; 14639cff245bSJames Collins }//end if 14649cff245bSJames Collins 14659cff245bSJames Collins if ($print === true) { 14669cff245bSJames Collins echo $html; 146775adba86SJames Collins } 1468a8eebd82SJames Collins 1469a8eebd82SJames Collins return $html; 147075adba86SJames Collins } 147175adba86SJames Collins 147275adba86SJames Collins 147375adba86SJames Collins /** 1474a8eebd82SJames Collins * Print or return out TOC 147575adba86SJames Collins * 14769cff245bSJames Collins * @param boolean $print Print TOC. 14779cff245bSJames Collins * @param boolean $parse Parse icons. 1478a8eebd82SJames Collins * @return string contents of TOC 147975adba86SJames Collins */ 14809cff245bSJames Collins public function includeTOC(bool $print = true, bool $parse = true) 148110b40067Snomadjimbob { 1482ab45ba71SJames Collins $html = ''; 14832b4583abSJames Collins 1484ab45ba71SJames Collins $tocHtml = tpl_toc(true); 1485ab45ba71SJames Collins 14863a385f2cSJames Collins if (empty($tocHtml) === false) { 1487f65a4e5eSJames Collins $tocHtml = preg_replace( 1488f65a4e5eSJames Collins '/(<h3.+?toggle.+?>)(.+?)<\/h3>/', 1489f65a4e5eSJames Collins '$1' . 1490f65a4e5eSJames Collins $this->mikioInlineIcon('hamburger', 'hamburger') . '$2' . 1491f65a4e5eSJames Collins $this->mikioInlineIcon('down-arrow', 'down-arrow') . '</h3>', 1492f65a4e5eSJames Collins $tocHtml 1493f65a4e5eSJames Collins ); 1494ab45ba71SJames Collins $tocHtml = preg_replace('/<li.*><div.*><a.*><\/a><\/div><\/li>\s*/', '', $tocHtml); 1495a8eebd82SJames Collins $tocHtml = preg_replace('/<ul.*>\s*<\/ul>\s*/', '', $tocHtml); 1496ab45ba71SJames Collins 1497ab45ba71SJames Collins $html .= '<div class="mikio-toc">'; 1498ab45ba71SJames Collins $html .= $tocHtml; 1499ab45ba71SJames Collins $html .= '</div>'; 15002b4583abSJames Collins } 15012b4583abSJames Collins 15029cff245bSJames Collins if ($parse === true) { 15039cff245bSJames Collins $html = $this->includeIcons($html); 15049cff245bSJames Collins } 15059cff245bSJames Collins 15069cff245bSJames Collins if ($print === true) { 1507ab45ba71SJames Collins echo $html; 1508ab45ba71SJames Collins } 1509ab45ba71SJames Collins 15109cff245bSJames Collins return $html; 15119cff245bSJames Collins } 15129cff245bSJames Collins 1513ab45ba71SJames Collins 1514a8eebd82SJames Collins /** 1515ab45ba71SJames Collins * Parse the string and replace icon elements with included icon libraries 1516ab45ba71SJames Collins * 15179cff245bSJames Collins * @param string $str Content to parse. 1518ab45ba71SJames Collins * @return string parsed string 1519ab45ba71SJames Collins */ 15209cff245bSJames Collins public function includeIcons(string $str) 152110b40067Snomadjimbob { 1522ab45ba71SJames Collins global $ACT, $MIKIO_ICONS; 1523ab45ba71SJames Collins 1524ab45ba71SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 15253a385f2cSJames Collins if (empty($iconTag) === true) { 15269cff245bSJames Collins return $str; 15279cff245bSJames Collins } 1528ab45ba71SJames Collins 15299cff245bSJames Collins if ( 15309cff245bSJames Collins in_array($ACT, ['show', 'showtag', 'revisions', 'index', 'preview']) === true || 15313a385f2cSJames Collins strcasecmp($ACT, 'admin') === 0 && count($MIKIO_ICONS) > 0 15329cff245bSJames Collins ) { 1533a2005a27SJames Collins $content = $str; 1534a2005a27SJames Collins $preview = null; 1535a2005a27SJames Collins 15363a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 15379cff245bSJames Collins $html = new \simple_html_dom(); 1538a2005a27SJames Collins $html->stripRNAttrValues = false; 1539a2005a27SJames Collins $html->load($str, true, false); 1540a2005a27SJames Collins 1541a2005a27SJames Collins $preview = $html->find('div.preview'); 15429cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1543a2005a27SJames Collins $content = $preview[0]->innertext; 1544a2005a27SJames Collins } 1545a2005a27SJames Collins } 1546a2005a27SJames Collins 15471785fc73SJames Collins $page_regex = '/(.*)/'; 15489cff245bSJames Collins if (stripos($str, '<pre') !== false) { 15491785fc73SJames Collins $page_regex = '/<(?!pre|\/).*?>(.*)[^<]*/'; 15501785fc73SJames Collins } 15511785fc73SJames Collins 15521785fc73SJames Collins $content = preg_replace_callback($page_regex, function ($icons) { 1553a2005a27SJames Collins $iconTag = $this->getConf('iconTag', 'icon'); 1554a2005a27SJames Collins 155510b40067Snomadjimbob return preg_replace_callback( 155610b40067Snomadjimbob '/<' . $iconTag . ' ([\w\- #]*)>(?=[^>]*(<|$))/', 1557ab45ba71SJames Collins function ($matches) { 1558ab45ba71SJames Collins global $MIKIO_ICONS; 1559ab45ba71SJames Collins 1560ab45ba71SJames Collins $s = $matches[0]; 1561ab45ba71SJames Collins 1562ab45ba71SJames Collins if (count($MIKIO_ICONS) > 0) { 1563ab45ba71SJames Collins $icon = $MIKIO_ICONS[0]; 1564ab45ba71SJames Collins 1565ab45ba71SJames Collins if (count($matches) > 1) { 1566ab45ba71SJames Collins $e = explode(' ', $matches[1]); 1567ab45ba71SJames Collins 1568ab45ba71SJames Collins if (count($e) > 1) { 1569ab45ba71SJames Collins foreach ($MIKIO_ICONS as $iconItem) { 15709cff245bSJames Collins if (strcasecmp($iconItem['name'], $e[0]) === 0) { 1571ab45ba71SJames Collins $icon = $iconItem; 1572ab45ba71SJames Collins 1573ab45ba71SJames Collins $s = $icon['insert']; 1574ab45ba71SJames Collins for ($i = 1; $i < 9; $i++) { 15751cdedf28SJames Collins if (count($e) < $i || empty($e[$i]) === true) { 15769cff245bSJames Collins if (isset($icon['$' . $i]) === true) { 1577ab45ba71SJames Collins $s = str_replace('$' . $i, $icon['$' . $i], $s); 1578ab45ba71SJames Collins } 1579ab45ba71SJames Collins } else { 1580ab45ba71SJames Collins $s = str_replace('$' . $i, $e[$i], $s); 1581ab45ba71SJames Collins } 1582ab45ba71SJames Collins } 1583ab45ba71SJames Collins 1584ab45ba71SJames Collins $dir = ''; 15859cff245bSJames Collins if (isset($icon['dir']) === true) { 15869cff245bSJames Collins $dir = $this->baseDir . 'icons/' . $icon['dir'] . '/'; 15879cff245bSJames Collins } 1588ab45ba71SJames Collins 1589ab45ba71SJames Collins $s = str_replace('$0', $dir, $s); 1590ab45ba71SJames Collins 1591ab45ba71SJames Collins break; 15929cff245bSJames Collins }//end if 15939cff245bSJames Collins }//end foreach 1594ab45ba71SJames Collins } else { 1595ab45ba71SJames Collins $s = str_replace('$1', $matches[1], $icon['insert']); 15969cff245bSJames Collins }//end if 15979cff245bSJames Collins }//end if 15989cff245bSJames Collins }//end if 159975adba86SJames Collins 1600ab45ba71SJames Collins $s = preg_replace('/(class=")(.*)"/', '$1mikio-icon $2"', $s, -1, $count); 16019cff245bSJames Collins if ($count === 0) { 1602ab45ba71SJames Collins $s = preg_replace('/(<\w* )/', '$1class="mikio-icon" ', $s); 1603ab45ba71SJames Collins } 1604ab45ba71SJames Collins 1605ab45ba71SJames Collins return $s; 1606ab45ba71SJames Collins }, 160710b40067Snomadjimbob $icons[0] 160810b40067Snomadjimbob ); 1609a2005a27SJames Collins }, $content); 1610a2005a27SJames Collins 16113a385f2cSJames Collins if (strcasecmp($ACT, 'preview') === 0) { 16129cff245bSJames Collins if (is_array($preview) === true && count($preview) > 0) { 1613a2005a27SJames Collins $preview[0]->innertext = $content; 1614a2005a27SJames Collins } 1615a2005a27SJames Collins 1616a2005a27SJames Collins $str = $html->save(); 1617a2005a27SJames Collins $html->clear(); 1618a2005a27SJames Collins unset($html); 1619a2005a27SJames Collins } else { 1620a2005a27SJames Collins $str = $content; 1621a2005a27SJames Collins } 16229cff245bSJames Collins }//end if 1623ab45ba71SJames Collins 1624ab45ba71SJames Collins return $str; 1625ab45ba71SJames Collins } 162647161538SJames Collins 1627c165b184SJames Collins /** 1628a8eebd82SJames Collins * Parse HTML for theme 1629c165b184SJames Collins * 16309cff245bSJames Collins * @param string $content HTML content to parse. 1631a8eebd82SJames Collins * @return string Parsed content 1632c165b184SJames Collins */ 16339cff245bSJames Collins public function parseContent(string $content) 163410b40067Snomadjimbob { 1635ab45ba71SJames Collins global $INPUT, $ACT; 1636ab45ba71SJames Collins 1637a8eebd82SJames Collins // Add Mikio Section titles 16383a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 16399cff245bSJames Collins $admin_sections = [ 1640ab45ba71SJames Collins // Section Insert Before Icon 16419cff245bSJames Collins 'navbar' => ['navbarUseTitleIcon', ''], 16429cff245bSJames Collins 'search' => ['searchButton', ''], 16439cff245bSJames Collins 'hero' => ['heroTitle', ''], 16449cff245bSJames Collins 'tags' => ['tagsConsolidate', ''], 16459cff245bSJames Collins 'breadcrumb' => ['breadcrumbHideHome', ''], 16469cff245bSJames Collins 'youarehere' => ['youarehereHideHome', ''], 16479cff245bSJames Collins 'sidebar' => ['sidebarShowLeft', ''], 16489cff245bSJames Collins 'toc' => ['tocFull', ''], 16499cff245bSJames Collins 'pagetools' => ['pageToolsFloating', ''], 16509cff245bSJames Collins 'footer' => ['footerCustomMenuText', ''], 16519cff245bSJames Collins 'license' => ['licenseType', ''], 16529cff245bSJames Collins 'acl' => ['includePageUseACL', ''], 16539cff245bSJames Collins 'sticky' => ['stickyTopHeader', ''], 16549cff245bSJames Collins ]; 1655ab45ba71SJames Collins 1656ab45ba71SJames Collins foreach ($admin_sections as $section => $items) { 1657ab45ba71SJames Collins $search = $items[0]; 1658ab45ba71SJames Collins $icon = $items[1]; 1659ab45ba71SJames Collins 166010b40067Snomadjimbob $content = preg_replace( 1661adf52ebbSJames Collins '/<tr(.*)>\s*<td class="label">\s*<span class="outkey">(tpl»mikio»' . $search . ')<\/span>/', 16629cff245bSJames Collins '<tr$1><td class="mikio-config-table-header" colspan="2">' . $this->mikioInlineIcon($icon) . 16639cff245bSJames Collins tpl_getLang('config_' . $section) . 16649cff245bSJames Collins '</td></tr><tr class="default"><td class="label"><span class="outkey">tpl»mikio»' . 16659cff245bSJames Collins $search . '</span>', 166610b40067Snomadjimbob $content 166710b40067Snomadjimbob ); 1668ab45ba71SJames Collins } 1669bb5a3dd1SJames Collins } elseif (strcasecmp($INPUT->str('page'), 'styling') === 0) { 1670ad182e6dSnomadjimbob $mikioPluginMissing = true; 1671ad182e6dSnomadjimbob /* Hide plugin fields if not installed */ 16729ffe9161Snomadjimbob if (plugin_load('action', 'mikioplugin') !== null) { 1673ad182e6dSnomadjimbob $mikioPluginMissing = false; 1674ad182e6dSnomadjimbob } 1675ad182e6dSnomadjimbob 1676cee81679SJames Collins $style_headers = [ 1677f65a4e5eSJames Collins ['title' => 'Base', 'starts_with' => '__text_'], 1678f65a4e5eSJames Collins ['title' => 'Code', 'starts_with' => '__code_'], 1679f65a4e5eSJames Collins ['title' => 'Controls', 'starts_with' => '__control_'], 1680f65a4e5eSJames Collins ['title' => 'Header', 'starts_with' => '__topheader_'], 1681f65a4e5eSJames Collins ['title' => 'Navbar', 'starts_with' => '__navbar_'], 1682f65a4e5eSJames Collins ['title' => 'Sub Navbar', 'starts_with' => '__subnavbar_'], 1683f65a4e5eSJames Collins ['title' => 'Tags', 'starts_with' => '__tag_background_color_'], 1684f65a4e5eSJames Collins ['title' => 'Breadcrumbs', 'starts_with' => '__breadcrumb_'], 1685f65a4e5eSJames Collins ['title' => 'Hero', 'starts_with' => '__hero_'], 1686f65a4e5eSJames Collins ['title' => 'Sidebar', 'starts_with' => '__sidebar_'], 1687f65a4e5eSJames Collins ['title' => 'Content', 'starts_with' => '__content_'], 1688f65a4e5eSJames Collins ['title' => 'TOC', 'starts_with' => '__toc_'], 1689f65a4e5eSJames Collins ['title' => 'Page Tools', 'starts_with' => '__pagetools_'], 1690f65a4e5eSJames Collins ['title' => 'Footer', 'starts_with' => '__footer_'], 1691f65a4e5eSJames Collins ['title' => 'Table', 'starts_with' => '__table_'], 1692f65a4e5eSJames Collins ['title' => 'Dropdown', 'starts_with' => '__dropdown_'], 1693f65a4e5eSJames Collins ['title' => 'Section Edit', 'starts_with' => '__section_edit_'], 1694f65a4e5eSJames Collins ['title' => 'Tree', 'starts_with' => '__tree_'], 1695f65a4e5eSJames Collins ['title' => 'Tabs', 'starts_with' => '__tab_'], 1696ad182e6dSnomadjimbob ['title' => 'Mikio Plugin', 'starts_with' => '__plugin_', 'heading' => 'h2', 16979ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 16989ffe9161Snomadjimbob ], 1699ad182e6dSnomadjimbob ['title' => 'Primary Colours', 'starts_with' => '__plugin_primary_', 'hidden' => $mikioPluginMissing], 1700ad182e6dSnomadjimbob ['title' => 'Secondary Colours', 'starts_with' => '__plugin_secondary_', 17019ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 17029ffe9161Snomadjimbob ], 1703ad182e6dSnomadjimbob ['title' => 'Success Colours', 'starts_with' => '__plugin_success_', 'hidden' => $mikioPluginMissing], 1704ad182e6dSnomadjimbob ['title' => 'Danger Colours', 'starts_with' => '__plugin_danger_', 'hidden' => $mikioPluginMissing], 1705ad182e6dSnomadjimbob ['title' => 'Warning Colours', 'starts_with' => '__plugin_warning_', 'hidden' => $mikioPluginMissing], 1706ad182e6dSnomadjimbob ['title' => 'Info Colours', 'starts_with' => '__plugin_info_', 'hidden' => $mikioPluginMissing], 1707ad182e6dSnomadjimbob ['title' => 'Light Colours', 'starts_with' => '__plugin_light_', 'hidden' => $mikioPluginMissing], 1708ad182e6dSnomadjimbob ['title' => 'Dark Colours', 'starts_with' => '__plugin_dark_', 'hidden' => $mikioPluginMissing], 1709ad182e6dSnomadjimbob ['title' => 'Link Colours', 'starts_with' => '__plugin_link_', 'hidden' => $mikioPluginMissing], 1710ad182e6dSnomadjimbob ['title' => 'Carousel', 'starts_with' => '__plugin_carousel_', 'hidden' => $mikioPluginMissing], 1711ad182e6dSnomadjimbob ['title' => 'Steps', 'starts_with' => '__plugin_steps_', 'hidden' => $mikioPluginMissing], 1712ad182e6dSnomadjimbob ['title' => 'Tabgroup', 'starts_with' => '__plugin_tabgroup_', 'hidden' => $mikioPluginMissing], 1713ad182e6dSnomadjimbob ['title' => 'Tooltip', 'starts_with' => '__plugin_tooltip_', 'hidden' => $mikioPluginMissing], 1714cee81679SJames Collins ['title' => 'Dark Mode', 'starts_with' => '__darkmode_', 'heading' => 'h2'], 1715f65a4e5eSJames Collins ['title' => 'Base', 'starts_with' => '__darkmode_text_'], 1716f65a4e5eSJames Collins ['title' => 'Code', 'starts_with' => '__darkmode_code_'], 1717f65a4e5eSJames Collins ['title' => 'Controls', 'starts_with' => '__darkmode_control_'], 1718f65a4e5eSJames Collins ['title' => 'Header', 'starts_with' => '__darkmode_topheader_'], 1719f65a4e5eSJames Collins ['title' => 'Navbar', 'starts_with' => '__darkmode_navbar_'], 1720f65a4e5eSJames Collins ['title' => 'Sub Navbar', 'starts_with' => '__darkmode_subnavbar_'], 1721f65a4e5eSJames Collins ['title' => 'Tags', 'starts_with' => '__darkmode_tag_background_color_'], 1722f65a4e5eSJames Collins ['title' => 'Breadcrumbs', 'starts_with' => '__darkmode_breadcrumb_'], 1723f65a4e5eSJames Collins ['title' => 'Hero', 'starts_with' => '__darkmode_hero_'], 1724f65a4e5eSJames Collins ['title' => 'Sidebar', 'starts_with' => '__darkmode_sidebar_'], 1725f65a4e5eSJames Collins ['title' => 'Content', 'starts_with' => '__darkmode_content_'], 1726f65a4e5eSJames Collins ['title' => 'TOC', 'starts_with' => '__darkmode_toc_'], 1727f65a4e5eSJames Collins ['title' => 'Page Tools', 'starts_with' => '__darkmode_pagetools_'], 1728f65a4e5eSJames Collins ['title' => 'Footer', 'starts_with' => '__darkmode_footer_'], 1729f65a4e5eSJames Collins ['title' => 'Table', 'starts_with' => '__darkmode_table_'], 1730f65a4e5eSJames Collins ['title' => 'Dropdown', 'starts_with' => '__darkmode_dropdown_'], 1731f65a4e5eSJames Collins ['title' => 'Section Edit', 'starts_with' => '__darkmode_section_edit_'], 1732f65a4e5eSJames Collins ['title' => 'Tree', 'starts_with' => '__darkmode_tree_'], 1733f65a4e5eSJames Collins ['title' => 'Tabs', 'starts_with' => '__darkmode_tab_'], 1734ad182e6dSnomadjimbob ['title' => 'Mikio Plugin (Dark mode)', 'starts_with' => '__plugin_darkmode_', 'heading' => 'h2', 17359ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 17369ffe9161Snomadjimbob ], 1737ad182e6dSnomadjimbob ['title' => 'Primary Colours', 'starts_with' => '__plugin_darkmode_primary_', 17389ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 17399ffe9161Snomadjimbob ], 1740ad182e6dSnomadjimbob ['title' => 'Secondary Colours', 'starts_with' => '__plugin_darkmode_secondary_', 17419ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 17429ffe9161Snomadjimbob ], 1743ad182e6dSnomadjimbob ['title' => 'Success Colours', 'starts_with' => '__plugin_darkmode_success_', 17449ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 17459ffe9161Snomadjimbob ], 1746ad182e6dSnomadjimbob ['title' => 'Danger Colours', 'starts_with' => '__plugin_darkmode_danger_', 17479ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 17489ffe9161Snomadjimbob ], 1749ad182e6dSnomadjimbob ['title' => 'Warning Colours', 'starts_with' => '__plugin_darkmode_warning_', 17509ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 17519ffe9161Snomadjimbob ], 1752ad182e6dSnomadjimbob ['title' => 'Info Colours', 'starts_with' => '__plugin_darkmode_info_', 17539ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 17549ffe9161Snomadjimbob ], 1755ad182e6dSnomadjimbob ['title' => 'Light Colours', 'starts_with' => '__plugin_darkmode_light_', 17569ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 17579ffe9161Snomadjimbob ], 1758ad182e6dSnomadjimbob ['title' => 'Dark Colours', 'starts_with' => '__plugin_darkmode_dark_', 17599ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 17609ffe9161Snomadjimbob ], 1761ad182e6dSnomadjimbob ['title' => 'Link Colours', 'starts_with' => '__plugin_darkmode_link_', 17629ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 17639ffe9161Snomadjimbob ], 1764ad182e6dSnomadjimbob ['title' => 'Carousel', 'starts_with' => '__plugin_darkmode_carousel_', 17659ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 17669ffe9161Snomadjimbob ], 1767ad182e6dSnomadjimbob ['title' => 'Steps', 'starts_with' => '__plugin_darkmode_steps_', 'hidden' => $mikioPluginMissing], 1768ad182e6dSnomadjimbob ['title' => 'Tabgroup', 'starts_with' => '__plugin_darkmode_tabgroup_', 17699ffe9161Snomadjimbob 'hidden' => $mikioPluginMissing 17709ffe9161Snomadjimbob ], 1771ad182e6dSnomadjimbob ['title' => 'Tooltip', 'starts_with' => '__plugin_darkmode_tooltip_', 'hidden' => $mikioPluginMissing], 1772cee81679SJames Collins ]; 1773cee81679SJames Collins 1774cee81679SJames Collins foreach ($style_headers as $header) { 1775cee81679SJames Collins if (array_key_exists('heading', $header) === false) { 1776cee81679SJames Collins $header['heading'] = 'h3'; 1777cee81679SJames Collins } 1778cee81679SJames Collins 1779ad182e6dSnomadjimbob if (array_key_exists('hidden', $header) === false) { 1780ad182e6dSnomadjimbob $header['hidden'] = false; 1781ad182e6dSnomadjimbob } 1782ad182e6dSnomadjimbob 17831244e3ceSJames Collins $content = preg_replace( 1784f65a4e5eSJames Collins '/(<tr>\s*<td>\s*<label for="tpl__' . $header['starts_with'] . '.+?<\/tr>)/s', 17859ffe9161Snomadjimbob '</tbody></table><' . $header['heading'] . ' style="display:' . 17869ffe9161Snomadjimbob ($header['hidden'] === true ? 'none' : 'block') . '">' . 17879ffe9161Snomadjimbob $header['title'] . '</' . $header['heading'] . '> 1788ad182e6dSnomadjimbob <table style="display:' . ($header['hidden'] === true ? 'none' : 'table') . '"><tbody>$1', 17891244e3ceSJames Collins $content, 17901244e3ceSJames Collins 1 17911244e3ceSJames Collins ); 1792cee81679SJames Collins } 1793f65a4e5eSJames Collins 1794f65a4e5eSJames Collins $content = preg_replace('/type="color"/', 'type="text"', $content); 1795bb5a3dd1SJames Collins }//end if 1796ab45ba71SJames Collins 17973a385f2cSJames Collins if (strcasecmp($ACT, 'admin') === 0 && isset($_GET['page']) === false) { 1798a8eebd82SJames Collins $content = preg_replace('/(<ul.*?>.*?)<\/ul>.*?<ul.*?>(.*?<\/ul>)/s', '$1$2', $content); 1799a8eebd82SJames Collins } 1800ab45ba71SJames Collins 1801a8eebd82SJames Collins // Page Revisions - Table Fix 18029cff245bSJames Collins if (strpos($content, 'id="page__revisions"') !== false) { 18039cff245bSJames Collins $content = preg_replace( 18049cff245bSJames Collins '/(<span class="sum">\s.*<\/span>\s.*<span class="user">\s.*<\/span>)/', 18059cff245bSJames Collins '<span>$1</span>', 18069cff245bSJames Collins $content 18079cff245bSJames Collins ); 1808a8eebd82SJames Collins } 1809ab45ba71SJames Collins 18109cff245bSJames Collins $html = new \simple_html_dom(); 1811bc1032d9SJames Collins $html->stripRNAttrValues = false; 1812c165b184SJames Collins $html->load($content, true, false); 1813c165b184SJames Collins 18149cff245bSJames Collins if ($html === false) { 18159cff245bSJames Collins return $content; 18169cff245bSJames Collins } 1817ab45ba71SJames Collins 1818ab45ba71SJames Collins /* Buttons */ 1819ab45ba71SJames Collins foreach ($html->find('#config__manager button') as $node) { 1820ab45ba71SJames Collins $c = explode(' ', $node->class); 18219cff245bSJames Collins if (in_array('mikio-button', $c) === false) { 18229cff245bSJames Collins $c[] = 'mikio-button'; 18239cff245bSJames Collins } 1824ab45ba71SJames Collins $node->class = implode(' ', $c); 1825c165b184SJames Collins } 1826c165b184SJames Collins 1827ab45ba71SJames Collins 1828ab45ba71SJames Collins /* Buttons - Primary */ 1829ab45ba71SJames Collins foreach ($html->find('#config__manager [type=submit]') as $node) { 1830ab45ba71SJames Collins $c = explode(' ', $node->class); 18319cff245bSJames Collins if (in_array('mikio-primary', $c) === false) { 18329cff245bSJames Collins $c[] = 'mikio-primary'; 18339cff245bSJames Collins } 1834ab45ba71SJames Collins $node->class = implode(' ', $c); 1835ab45ba71SJames Collins } 1836ab45ba71SJames Collins 1837a8eebd82SJames Collins /* Hide page title if hero is enabled */ 18389cff245bSJames Collins if ($this->getConf('heroTitle') === true && $ACT !== 'preview') { 18391785fc73SJames Collins $pageTitle = $this->parsePageTitle(); 184047161538SJames Collins 184147161538SJames Collins foreach ($html->find('h1,h2,h3,h4') as $elm) { 18429cff245bSJames Collins if ($elm->innertext === $pageTitle) { 1843a8eebd82SJames Collins // $elm->innertext = ''; 1844a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1845a8eebd82SJames Collins 184647161538SJames Collins break; 184747161538SJames Collins } 184847161538SJames Collins } 184947161538SJames Collins } 1850c165b184SJames Collins 1851a8eebd82SJames Collins /* Hero subtitle */ 18522b4583abSJames Collins foreach ($html->find('p') as $elm) { 18532b4583abSJames Collins $i = stripos($elm->innertext, '~~hero-subtitle'); 18542b4583abSJames Collins if ($i !== false) { 18559cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 18562b4583abSJames Collins if ($j !== false) { 18579cff245bSJames Collins if ($j > ($i + 16)) { 18589cff245bSJames Collins $subtitle = substr($elm->innertext, ($i + 16), ($j - $i - 16)); 1859a8eebd82SJames Collins $this->footerScript['hero-subtitle'] = 'mikio.setHeroSubTitle(\'' . $subtitle . '\')'; 1860a8eebd82SJames Collins 1861a8eebd82SJames Collins // $elm->innertext = substr($elm->innertext, 0, $i + 2) . substr($elm->innertext, $j + 2); 1862a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-subtitle (.+?)~~.*/ui', '', $elm->innertext); 18632b4583abSJames Collins } 18642b4583abSJames Collins 18652b4583abSJames Collins break; 18662b4583abSJames Collins } 18672b4583abSJames Collins } 18682b4583abSJames Collins } 18692b4583abSJames Collins 1870a8eebd82SJames Collins /* Hero image */ 1871a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1872a8eebd82SJames Collins $image = ''; 1873a8eebd82SJames Collins preg_match('/~~hero-image (.+?)~~(?!.?")/ui', $elm->innertext, $matches); 1874a8eebd82SJames Collins if (count($matches) > 0) { 1875a8eebd82SJames Collins preg_match('/<img.*src="(.+?)"/ui', $matches[1], $imageTagMatches); 1876a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1877a8eebd82SJames Collins $image = $imageTagMatches[1]; 1878a8eebd82SJames Collins } else { 1879a8eebd82SJames Collins preg_match('/<a.+?>(.+?)[~<]/ui', $matches[1], $imageTagMatches); 1880a8eebd82SJames Collins if (count($imageTagMatches) > 0) { 1881a8eebd82SJames Collins $image = $imageTagMatches[1]; 1882a8eebd82SJames Collins } else { 1883a8eebd82SJames Collins $image = strip_tags($matches[1]); 18849cff245bSJames Collins if (stripos($image, ':') === false) { 18859cff245bSJames Collins $image = str_replace(['{', '}'], '', $image); 1886a8eebd82SJames Collins $i = stripos($image, '?'); 18879cff245bSJames Collins if ($i !== false) { 1888a8eebd82SJames Collins $image = substr($image, 0, $i); 1889c165b184SJames Collins } 1890c165b184SJames Collins 1891a8eebd82SJames Collins $image = ml($image, '', true, '', false); 1892ab45ba71SJames Collins } 1893ab45ba71SJames Collins } 1894ab45ba71SJames Collins } 1895ab45ba71SJames Collins 1896a8eebd82SJames Collins $this->footerScript['hero-image'] = 'mikio.setHeroImage(\'' . $image . '\')'; 1897a8eebd82SJames Collins 1898a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-image (.+?)~~.*/ui', '', $elm->innertext); 18999cff245bSJames Collins }//end if 19009cff245bSJames Collins }//end foreach 1901ab45ba71SJames Collins 19029cff245bSJames Collins /* Hero colors - ~~hero-colors [background-color] [hero-title-color] [hero-subtitle-color] 19039cff245bSJames Collins [breadcrumb-text-color] [breadcrumb-hover-color] (use 'initial' for original color) */ 1904a8eebd82SJames Collins foreach ($html->find('p') as $elm) { 1905a8eebd82SJames Collins $i = stripos($elm->innertext, '~~hero-colors'); 1906a8eebd82SJames Collins if ($i !== false) { 19079cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 1908a8eebd82SJames Collins if ($j !== false) { 19099cff245bSJames Collins if ($j > ($i + 14)) { 19109cff245bSJames Collins $color = substr($elm->innertext, ($i + 14), ($j - $i - 14)); 1911a8eebd82SJames Collins $this->footerScript['hero-colors'] = 'mikio.setHeroColor(\'' . $color . '\')'; 1912ab45ba71SJames Collins 1913a8eebd82SJames Collins $elm->innertext = preg_replace('/~~hero-colors (.+?)~~.*/ui', '', $elm->innertext); 1914ab45ba71SJames Collins } 1915ab45ba71SJames Collins 1916a8eebd82SJames Collins break; 1917ab45ba71SJames Collins } 1918ab45ba71SJames Collins } 1919ab45ba71SJames Collins } 1920ab45ba71SJames Collins 192196ec8e1eSJames Collins /* Hide parts - ~~hide-parts [parts]~~ */ 192296ec8e1eSJames Collins foreach ($html->find('p') as $elm) { 192396ec8e1eSJames Collins $i = stripos($elm->innertext, '~~hide-parts'); 192496ec8e1eSJames Collins if ($i !== false) { 19259cff245bSJames Collins $j = strpos($elm->innertext, '~~', ($i + 2)); 192696ec8e1eSJames Collins if ($j !== false) { 19279cff245bSJames Collins if ($j > ($i + 13)) { 19289cff245bSJames Collins $parts = explode(' ', substr($elm->innertext, ($i + 13), ($j - $i - 13))); 192996ec8e1eSJames Collins $script = ''; 193096ec8e1eSJames Collins 193196ec8e1eSJames Collins foreach ($parts as $part) { 193296ec8e1eSJames Collins // $part = trim($part); 193396ec8e1eSJames Collins if (strlen($part) > 0) { 193496ec8e1eSJames Collins $script .= 'mikio.hidePart(\'' . $part . '\');'; 193596ec8e1eSJames Collins } 193696ec8e1eSJames Collins } 193796ec8e1eSJames Collins 193896ec8e1eSJames Collins if (strlen($script) > 0) { 193996ec8e1eSJames Collins $this->footerScript['hide-parts'] = $script; 194096ec8e1eSJames Collins } 194196ec8e1eSJames Collins 194296ec8e1eSJames Collins $elm->innertext = preg_replace('/~~hide-parts (.+?)~~.*/ui', '', $elm->innertext); 194396ec8e1eSJames Collins } 194496ec8e1eSJames Collins 194596ec8e1eSJames Collins break; 19469cff245bSJames Collins }//end if 19479cff245bSJames Collins }//end if 19489cff245bSJames Collins }//end foreach 194996ec8e1eSJames Collins 195096ec8e1eSJames Collins 1951a8eebd82SJames Collins /* Page Tags (tag plugin) */ 19529cff245bSJames Collins if ($this->getConf('tagsConsolidate') === true) { 1953a8eebd82SJames Collins $tags = ''; 1954a8eebd82SJames Collins foreach ($html->find('div.tags a') as $elm) { 1955a8eebd82SJames Collins $tags .= $elm->outertext; 1956a8eebd82SJames Collins } 1957a8eebd82SJames Collins 1958a8eebd82SJames Collins foreach ($html->find('div.tags') as $elm) { 1959a8eebd82SJames Collins $elm->innertext = ''; 1960a8eebd82SJames Collins $elm->setAttribute('style', 'display:none'); 1961a8eebd82SJames Collins } 1962a8eebd82SJames Collins 19633a385f2cSJames Collins if (empty($tags) === false) { 1964a8eebd82SJames Collins $this->footerScript['tags'] = 'mikio.setTags(\'' . $tags . '\')'; 1965a8eebd82SJames Collins } 1966ab45ba71SJames Collins } 1967ab45ba71SJames Collins 1968ab45ba71SJames Collins // Configuration Manager 19693a385f2cSJames Collins if (strcasecmp($INPUT->str('page'), 'config') === 0) { 1970ab45ba71SJames Collins // Additional save buttons 1971ab45ba71SJames Collins foreach ($html->find('#config__manager') as $cm) { 1972ab45ba71SJames Collins $saveButtons = ''; 1973ab45ba71SJames Collins 1974ab45ba71SJames Collins foreach ($cm->find('p') as $elm) { 1975ab45ba71SJames Collins $saveButtons = $elm->outertext; 1976a8eebd82SJames Collins $saveButtons = str_replace('<p>', '<p style="text-align:right">', $saveButtons); 1977ab45ba71SJames Collins $elm->outertext = ''; 1978ab45ba71SJames Collins } 1979ab45ba71SJames Collins 1980ab45ba71SJames Collins foreach ($cm->find('fieldset') as $elm) { 1981ab45ba71SJames Collins $elm->innertext .= $saveButtons; 1982ab45ba71SJames Collins } 1983ab45ba71SJames Collins } 1984ab45ba71SJames Collins } 1985ab45ba71SJames Collins 1986ab45ba71SJames Collins $content = $html->save(); 1987c165b184SJames Collins $html->clear(); 1988c165b184SJames Collins unset($html); 1989c165b184SJames Collins 1990c165b184SJames Collins return $content; 1991c165b184SJames Collins } 19922b4583abSJames Collins 19932b4583abSJames Collins 1994a8eebd82SJames Collins /** 1995a8eebd82SJames Collins * Get DokuWiki namespace/page/URI as link 1996a8eebd82SJames Collins * 19979cff245bSJames Collins * @param string $str String to parse. 19989cff245bSJames Collins * @return string parsed URI 1999a8eebd82SJames Collins */ 20009cff245bSJames Collins public function getLink(string $str) 200110b40067Snomadjimbob { 20022b4583abSJames Collins $i = strpos($str, '://'); 20039cff245bSJames Collins if ($i !== false) { 20049cff245bSJames Collins return $str; 20059cff245bSJames Collins } 20062b4583abSJames Collins 20072b4583abSJames Collins return wl($str); 20082b4583abSJames Collins } 2009ab45ba71SJames Collins 2010ab45ba71SJames Collins 2011a8eebd82SJames Collins /** 2012a8eebd82SJames Collins * Check if the user can edit current namespace/page 2013a8eebd82SJames Collins * 2014a8eebd82SJames Collins * @return boolean user can edit 2015a8eebd82SJames Collins */ 201610b40067Snomadjimbob public function userCanEdit() 201710b40067Snomadjimbob { 2018ab45ba71SJames Collins global $INFO; 2019ab45ba71SJames Collins global $ID; 2020ab45ba71SJames Collins 2021ab45ba71SJames Collins $wiki_file = wikiFN($ID); 20229cff245bSJames Collins if (@file_exists($wiki_file) === false) { 20239cff245bSJames Collins return true; 20249cff245bSJames Collins } 20259cff245bSJames Collins if ($INFO['isadmin'] === true || $INFO['ismanager'] === true) { 20269cff245bSJames Collins return true; 20279cff245bSJames Collins } 2028a8eebd82SJames Collins // $meta_file = metaFN($ID, '.meta'); 20299cff245bSJames Collins if ($INFO['meta']['user'] === false) { 20309cff245bSJames Collins return true; 20319cff245bSJames Collins } 20329cff245bSJames Collins if ($INFO['client'] === $INFO['meta']['user']) { 20339cff245bSJames Collins return true; 20349cff245bSJames Collins } 2035ab45ba71SJames Collins 2036ab45ba71SJames Collins return false; 2037c165b184SJames Collins } 203847161538SJames Collins 203947161538SJames Collins 2040a8eebd82SJames Collins /** 2041a8eebd82SJames Collins * Search for and return the uri of a media file 2042a8eebd82SJames Collins * 20439cff245bSJames Collins * @param string $image Image name to search for (without extension). 20449cff245bSJames Collins * @param boolean $searchCurrentNS Search the current namespace. 20459cff245bSJames Collins * @param boolean $propagate Propagate search through the namespace. 20469cff245bSJames Collins * @return string URI of the found media file 2047a8eebd82SJames Collins */ 20489cff245bSJames Collins public function getMediaFile(string $image, bool $searchCurrentNS = true, bool $propagate = true) 204910b40067Snomadjimbob { 2050ab45ba71SJames Collins global $INFO; 2051a8eebd82SJames Collins 20529cff245bSJames Collins $ext = ['png', 'jpg', 'gif', 'svg']; 2053ab45ba71SJames Collins 20549cff245bSJames Collins if ($searchCurrentNS === true) { 20559cff245bSJames Collins $prefix[] = ':' . $INFO['namespace'] . ':'; 20569cff245bSJames Collins } 20579cff245bSJames Collins if ($propagate === true) { 2058ab45ba71SJames Collins $prefix[] = ':'; 2059ab45ba71SJames Collins $prefix[] = ':wiki:'; 2060a8eebd82SJames Collins } 2061ab45ba71SJames Collins $theme = $this->getConf('customTheme'); 20623a385f2cSJames Collins if (empty($theme) === false) { 20639cff245bSJames Collins $prefix[] = 'themes/' . $theme . '/images/'; 20649cff245bSJames Collins } 2065ab45ba71SJames Collins $prefix[] = 'images/'; 2066ab45ba71SJames Collins 20679cff245bSJames Collins $search = []; 2068ab45ba71SJames Collins foreach ($prefix as $pitem) { 2069ab45ba71SJames Collins foreach ($ext as $eitem) { 2070ab45ba71SJames Collins $search[] = $pitem . $image . '.' . $eitem; 2071ab45ba71SJames Collins } 2072ab45ba71SJames Collins } 2073ab45ba71SJames Collins 2074ab45ba71SJames Collins $img = ''; 2075ab45ba71SJames Collins $file = ''; 2076ab45ba71SJames Collins $url = ''; 2077ab45ba71SJames Collins $ismedia = false; 2078ab45ba71SJames Collins $found = false; 2079ab45ba71SJames Collins 2080ab45ba71SJames Collins foreach ($search as $img) { 20813a385f2cSJames Collins if (strcasecmp(substr($img, 0, 1), ':') === 0) { 2082ab45ba71SJames Collins $file = mediaFN($img); 2083ab45ba71SJames Collins $ismedia = true; 2084ab45ba71SJames Collins } else { 2085ab45ba71SJames Collins $file = tpl_incdir() . $img; 2086ab45ba71SJames Collins $ismedia = false; 2087ab45ba71SJames Collins } 2088ab45ba71SJames Collins 20899cff245bSJames Collins if (file_exists($file) === true) { 2090ab45ba71SJames Collins $found = true; 2091ab45ba71SJames Collins break; 2092ab45ba71SJames Collins } 2093ab45ba71SJames Collins } 2094ab45ba71SJames Collins 20959cff245bSJames Collins if ($found === false) { 20969cff245bSJames Collins return false; 20979cff245bSJames Collins } 2098ab45ba71SJames Collins 20999cff245bSJames Collins if ($ismedia === true) { 2100ab45ba71SJames Collins $url = ml($img, '', true, '', false); 2101ab45ba71SJames Collins } else { 2102ab45ba71SJames Collins $url = tpl_basedir() . $img; 2103ab45ba71SJames Collins } 2104ab45ba71SJames Collins 2105ab45ba71SJames Collins return $url; 2106ab45ba71SJames Collins } 2107ab45ba71SJames Collins 2108a8eebd82SJames Collins 2109a8eebd82SJames Collins /** 2110ab45ba71SJames Collins * Print or return the page title 2111ab45ba71SJames Collins * 21129cff245bSJames Collins * @param string $page Page id or empty string for current page. 2113ab45ba71SJames Collins * @return string generated content 2114ab45ba71SJames Collins */ 21159cff245bSJames Collins public function getPageTitle(string $page = '') 211610b40067Snomadjimbob { 2117ab45ba71SJames Collins global $ID, $conf; 2118ab45ba71SJames Collins 2119ab45ba71SJames Collins $html = ''; 2120ab45ba71SJames Collins 21213a385f2cSJames Collins if (empty($page) === true) { 21229cff245bSJames Collins $page = $ID; 21239cff245bSJames Collins } 2124ab45ba71SJames Collins 2125ab45ba71SJames Collins $html = p_get_first_heading($page); 2126ab45ba71SJames Collins $html = strip_tags($html); 2127ab45ba71SJames Collins $html = preg_replace('/\s+/', ' ', $html); 2128ab45ba71SJames Collins $html .= ' [' . strip_tags($conf['title']) . ']'; 2129ab45ba71SJames Collins $html = trim($html); 2130ab45ba71SJames Collins 2131ab45ba71SJames Collins return $html; 2132ab45ba71SJames Collins } 2133a8eebd82SJames Collins 2134a8eebd82SJames Collins 2135a8eebd82SJames Collins /** 2136a8eebd82SJames Collins * Return inline theme icon 2137a8eebd82SJames Collins * 21389cff245bSJames Collins * @param string $type Icon to retreive. 21399e41d878SJames Collins * @param string $class Classname to insert. 21409cff245bSJames Collins * @return string HTML icon content 2141a8eebd82SJames Collins */ 21429e41d878SJames Collins public function mikioInlineIcon(string $type, string $class = "") 214310b40067Snomadjimbob { 21449e41d878SJames Collins if (is_array($class) === true) { 21459e41d878SJames Collins $class = explode(' ', $class); 21469e41d878SJames Collins } 21479e41d878SJames Collins 21489e41d878SJames Collins if (strlen($class) > 0) { 21499e41d878SJames Collins $class = ' ' . $class; 21509e41d878SJames Collins } 21519e41d878SJames Collins 2152a8eebd82SJames Collins switch ($type) { 2153a8eebd82SJames Collins case 'wrench': 2154906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 -256 1792 2155906e1a13SJames Collins1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,53.152542,1217.0847)"><path d="m 384,64 q 0,26 -19,45 -19, 2156906e1a13SJames Collins19 -45,19 -26,0 -45,-19 -19,-19 -19,-45 0,-26 19,-45 19,-19 45,-19 26,0 45,19 19,19 19,45 z m 644,420 -682,-682 q -37, 2157906e1a13SJames Collins-37 -90,-37 -52,0 -91,37 L 59,-90 Q 21,-54 21,0 21,53 59,91 L 740,772 Q 779,674 854.5,598.5 930,523 1028,484 z m 634, 2158906e1a13SJames Collins435 q 0,-39 -23,-106 Q 1592,679 1474.5,595.5 1357,512 1216,512 1031,512 899.5,643.5 768,775 768,960 q 0,185 131.5,316.5 2159906e1a13SJames Collins131.5,131.5 316.5,131.5 58,0 121.5,-16.5 63.5,-16.5 107.5,-46.5 16,-11 16,-28 0,-17 -16,-28 L 1152,1120 V 896 l 193, 2160906e1a13SJames Collins-107 q 5,3 79,48.5 74,45.5 135.5,81 61.5,35.5 70.5,35.5 15,0 23.5,-10 8.5,-10 8.5,-25 z"/></g></svg>'; 2161a8eebd82SJames Collins case 'file': 2162906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2163906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,235.38983,1277.8305)" id="g2991"> 2164906e1a13SJames Collins<path d="M 128,0 H 1152 V 768 H 736 q -40,0 -68,28 -28,28 -28,68 v 416 H 128 V 0 z m 640,896 h 299 L 768,1195 V 896 z M 2165906e1a13SJames Collins1280,768 V -32 q 0,-40 -28,-68 -28,-28 -68,-28 H 96 q -40,0 -68,28 -28,28 -28,68 v 1344 q 0,40 28,68 28,28 68,28 h 544 2166906e1a13SJames Collinsq 40,0 88,-20 48,-20 76,-48 l 408,-408 q 28,-28 48,-76 20,-48 20,-88 z" id="path2993" inkscape:connector-curvature="0" 21679cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 2168a8eebd82SJames Collins case 'gear': 2169906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2170906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,121.49153,1285.4237)" id="g3027"> 2171906e1a13SJames Collins<path d="m 1024,640 q 0,106 -75,181 -75,75 -181,75 -106,0 -181,-75 -75,-75 -75,-181 0,-106 75,-181 75,-75 181,-75 106,0 2172906e1a13SJames Collins181,75 75,75 75,181 z m 512,109 V 527 q 0,-12 -8,-23 -8,-11 -20,-13 l -185,-28 q -19,-54 -39,-91 35,-50 107,-138 10,-12 2173906e1a13SJames Collins10,-25 0,-13 -9,-23 -27,-37 -99,-108 -72,-71 -94,-71 -12,0 -26,9 l -138,108 q -44,-23 -91,-38 -16,-136 -29,-186 -7,-28 2174906e1a13SJames Collins-36,-28 H 657 q -14,0 -24.5,8.5 Q 622,-111 621,-98 L 593,86 q -49,16 -90,37 L 362,16 Q 352,7 337,7 323,7 312,18 186,132 2175906e1a13SJames Collins147,186 q -7,10 -7,23 0,12 8,23 15,21 51,66.5 36,45.5 54,70.5 -27,50 -41,99 L 29,495 Q 16,497 8,507.5 0,518 0,531 v 222 2176906e1a13SJames Collinsq 0,12 8,23 8,11 19,13 l 186,28 q 14,46 39,92 -40,57 -107,138 -10,12 -10,24 0,10 9,23 26,36 98.5,107.5 72.5,71.5 94.5, 2177906e1a13SJames Collins71.5 13,0 26,-10 l 138,-107 q 44,23 91,38 16,136 29,186 7,28 36,28 h 222 q 14,0 24.5,-8.5 Q 914,1391 915,1378 l 28,-184 2178906e1a13SJames Collinsq 49,-16 90,-37 l 142,107 q 9,9 24,9 13,0 25,-10 129,-119 165,-170 7,-8 7,-22 0,-12 -8,-23 -15,-21 -51,-66.5 -36,-45.5 2179906e1a13SJames Collins-54,-70.5 26,-50 41,-98 l 183,-28 q 13,-2 21,-12.5 8,-10.5 8,-23.5 z" id="path3029" inkscape:connector-curvature="0" /> 2180906e1a13SJames Collins</g></svg>'; 2181a8eebd82SJames Collins case 'user': 2182906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2183906e1a13SJames CollinsviewBox="0 -256 1792 1792" style="fill:currentColor"><g transform="matrix(1,0,0,-1,197.42373,1300.6102)"><path d="M 2184906e1a13SJames Collins1408,131 Q 1408,11 1335,-58.5 1262,-128 1141,-128 H 267 Q 146,-128 73,-58.5 0,11 0,131 0,184 3.5,234.5 7,285 17.5,343.5 2185906e1a13SJames Collins28,402 44,452 q 16,50 43,97.5 27,47.5 62,81 35,33.5 85.5,53.5 50.5,20 111.5,20 9,0 42,-21.5 33,-21.5 74.5,-48 41.5, 2186906e1a13SJames Collins-26.5 108,-48 Q 637,565 704,565 q 67,0 133.5,21.5 66.5,21.5 108,48 41.5,26.5 74.5,48 33,21.5 42,21.5 61,0 111.5,-20 2187906e1a13SJames Collins50.5,-20 85.5,-53.5 35,-33.5 62,-81 27,-47.5 43,-97.5 16,-50 26.5,-108.5 10.5,-58.5 14,-109 Q 1408,184 1408,131 z m 2188906e1a13SJames Collins-320,893 Q 1088,865 975.5,752.5 863,640 704,640 545,640 432.5,752.5 320,865 320,1024 320,1183 432.5,1295.5 545,1408 704, 2189906e1a13SJames Collins1408 863,1408 975.5,1295.5 1088,1183 1088,1024 z"/></g></svg>'; 2190a8eebd82SJames Collins case 'search': 21919e41d878SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" 21929cff245bSJames 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 21939cff245bSJames 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 21949cff245bSJames 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 21959cff245bSJames Collins6.195 0 0 1-6.188 6.188z"/></svg>'; 2196a8eebd82SJames Collins case 'home': 2197906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2198906e1a13SJames CollinsviewBox="0 -256 1792 1792" aria-hidden="true" style="fill:currentColor"><g 2199906e1a13SJames Collinstransform="matrix(1,0,0,-1,68.338983,1285.4237)" id="g3015"><path d="M 1408,544 V 64 Q 1408,38 1389,19 1370,0 1344,0 H 2200906e1a13SJames Collins960 V 384 H 704 V 0 H 320 q -26,0 -45,19 -19,19 -19,45 v 480 q 0,1 0.5,3 0.5,2 0.5,3 l 575,474 575,-474 q 1,-2 1,-6 z 2201906e1a13SJames Collinsm 223,69 -62,-74 q -8,-9 -21,-11 h -3 q -13,0 -21,7 L 832,1112 140,535 q -12,-8 -24,-7 -13,2 -21,11 l -62,74 q -8,10 2202906e1a13SJames Collins-7,23.5 1,13.5 11,21.5 l 719,599 q 32,26 76,26 44,0 76,-26 l 244,-204 v 195 q 0,14 9,23 9,9 23,9 h 192 q 14,0 23,-9 9, 2203906e1a13SJames Collins-9 9,-23 V 840 l 219,-182 q 10,-8 11,-21.5 1,-13.5 -7,-23.5 z" id="path3017" inkscape:connector-curvature="0" 22049cff245bSJames Collinsxmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" /></g></svg>'; 22059e41d878SJames Collins case 'sun': 2206906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2207906e1a13SJames Collinsstyle="fill:currentColor" viewBox="0 0 16 16"><path d="M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0 2208906e1a13SJames Collins0 8zm.5-9.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm0 11a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0zm5-5a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-11 2209906e1a13SJames Collins0a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm9.743-4.036a.5.5 0 1 1-.707-.707.5.5 0 0 1 .707.707zm-7.779 7.779a.5.5 0 1 2210906e1a13SJames Collins1-.707-.707.5.5 0 0 1 .707.707zm7.072 0a.5.5 0 1 1 .707-.707.5.5 0 0 1-.707.707zM3.757 4.464a.5.5 0 1 1 .707-.707.5.5 2211906e1a13SJames Collins0 0 1-.707.707z" /></svg>'; 22129e41d878SJames Collins case 'moon': 2213906e1a13SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2214906e1a13SJames Collinsstyle="fill:currentColor" viewBox="0 0 16 16"><path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 2215906e1a13SJames Collins4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 2216906e1a13SJames Collins1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278zM4.858 1.311A7.269 7.269 0 0 0 2217906e1a13SJames Collins1.025 7.71c0 4.02 3.279 7.276 7.319 7.276a7.316 7.316 0 0 0 5.205-2.162c-.337.042-.68.063-1.029.063-4.61 2218906e1a13SJames Collins0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286z" /></svg>'; 221934d5f19aSJames Collins case 'sunmoon': 2220d0fba6d1SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" 2221d0fba6d1SJames Collinsstyle="fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10" 2222d0fba6d1SJames CollinsviewBox="0 0 32 32"><line x1="16" y1="3" x2="16" y2="29"/><path d="M16,23c-3.87,0-7-3.13-7-7s3.13-7,7-7"/><line 2223d0fba6d1SJames Collinsx1="6.81" y1="6.81" x2="8.93" y2="8.93"/><line x1="3" y1="16" x2="6" y2="16"/><line x1="6.81" y1="25.19" x2="8.93" 2224d0fba6d1SJames Collinsy2="23.07"/><path d="M16,12.55C17.2,10.43,19.48,9,22.09,9c0.16,0,0.31,0.01,0.47,0.02c-1.67,0.88-2.8,2.63-2.8,4.64c0,2.9, 2225d0fba6d1SJames Collins2.35,5.25,5.25,5.25c1.6,0,3.03-0.72,3.99-1.85C28.48,20.43,25.59,23,22.09,23c-2.61,0-4.89-1.43-6.09-3.55"/></svg>'; 2226f65a4e5eSJames Collins case 'hamburger': 2227f65a4e5eSJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" 2228f65a4e5eSJames Collinsstyle="fill:currentColor"><path d="M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 2229f65a4e5eSJames Collins76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 2230f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 2231f65a4e5eSJames Collins16v40c0 8.837 7.163 16 16 16z"/></svg>'; 2232f65a4e5eSJames Collins case 'down-arrow': 2233f65a4e5eSJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" 2234f65a4e5eSJames Collinsaria-hidden="true" style="fill:currentColor"><path d="M16.003 18.626l7.081-7.081L25 13.46l-8.997 8.998-9.003-9 2235f65a4e5eSJames Collins1.917-1.916z"/></svg>'; 2236*3a3ece10SJames Collins case 'language': 2237*3a3ece10SJames Collins return '<svg class="mikio-iicon' . $class . '" xmlns="http://www.w3.org/2000/svg" width="16" 2238*3a3ece10SJames Collinsheight="16" fill="currentColor" viewBox="0 0 16 16"><path d="M4.545 6.714 4.11 2239*3a3ece10SJames Collins8H3l1.862-5h1.284L8 8H6.833l-.435-1.286H4.545zm1.634-.736L5.5 3.956h-.049l-.679 2.022H6.18z"/><path d="M0 2a2 2 0 0 1 2240*3a3ece10SJames Collins2-2h7a2 2 0 0 1 2 2v3h3a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2v-3H2a2 2 0 0 1-2-2V2zm2-1a1 1 0 0 0-1 1v7a1 1 0 0 2241*3a3ece10SJames Collins0 1 1h7a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1H2zm7.138 9.995c.193.301.402.583.63.846-.748.575-1.673 1.001-2.768 2242*3a3ece10SJames Collins1.292.178.217.451.635.555.867 1.125-.359 2.08-.844 2.886-1.494.777.665 1.739 1.165 2.93 2243*3a3ece10SJames Collins1.472.133-.254.414-.673.629-.89-1.125-.253-2.057-.694-2.82-1.284.681-.747 1.222-1.651 2244*3a3ece10SJames Collins1.621-2.757H14V8h-3v1.047h.765c-.318.844-.74 1.546-1.272 2.13a6.066 6.066 0 0 1-.415-.492 1.988 1.988 0 0 1-.94.31z"/> 2245*3a3ece10SJames Collins</svg>'; 22469cff245bSJames Collins }//end switch 2247ab45ba71SJames Collins 2248a8eebd82SJames Collins return ''; 2249a8eebd82SJames Collins } 2250ab45ba71SJames Collins 2251a8eebd82SJames Collins /** 2252a8eebd82SJames Collins * Finalize theme 22539cff245bSJames Collins * 22549cff245bSJames Collins * @return void 2255a8eebd82SJames Collins */ 225610b40067Snomadjimbob public function finalize() 225710b40067Snomadjimbob { 2258a8eebd82SJames Collins } 22591785fc73SJames Collins 22601785fc73SJames Collins /** 22611785fc73SJames Collins * Show Messages 22629cff245bSJames Collins * 22639cff245bSJames Collins * @return void 22641785fc73SJames Collins */ 226510b40067Snomadjimbob public function showMessages() 226610b40067Snomadjimbob { 22671785fc73SJames Collins global $ACT; 22681785fc73SJames Collins 22699cff245bSJames Collins if ($this->lessIgnored === true) { 22709cff245bSJames Collins msg( 22719cff245bSJames Collins 'useLESS is enabled on the Mikio template, however is not supported on this server', 22729cff245bSJames Collins 2, 22739cff245bSJames Collins '', 22749cff245bSJames Collins '', 22759cff245bSJames Collins MSG_ADMINS_ONLY 22769cff245bSJames Collins ); 2277a8df40efSJames Collins } 2278a8df40efSJames Collins 22791785fc73SJames Collins $show = $this->getConf('showNotifications'); 22803a385f2cSJames Collins if ( 22813a385f2cSJames Collins strcasecmp($show, 'always') === 0 || 22823a385f2cSJames Collins (strcasecmp($show, 'admin') === 0 && strcasecmp($ACT, 'admin') === 0) 22833a385f2cSJames Collins ) { 22841785fc73SJames Collins global $MSG, $MSG_shown; 22851785fc73SJames Collins 22869cff245bSJames Collins if (isset($MSG) === false) { 22871785fc73SJames Collins return; 22881785fc73SJames Collins } 22891785fc73SJames Collins 22909cff245bSJames Collins if (isset($MSG_shown) === false) { 22919cff245bSJames Collins $MSG_shown = []; 2292a8df40efSJames Collins } 22931785fc73SJames Collins 22941785fc73SJames Collins foreach ($MSG as $msg) { 22951785fc73SJames Collins $hash = md5($msg['msg']); 22969cff245bSJames Collins if (isset($MSG_shown[$hash]) === true) { 22971785fc73SJames Collins continue; 22981785fc73SJames Collins } 22991785fc73SJames Collins // skip double messages 23001785fc73SJames Collins 23019cff245bSJames Collins if (info_msg_allowed($msg) === true) { 23029cff245bSJames Collins echo '<div class="' . $msg['lvl'] . '">'; 23039cff245bSJames Collins echo $msg['msg']; 23049cff245bSJames Collins echo '</div>'; 23051785fc73SJames Collins } 23061785fc73SJames Collins 2307a8df40efSJames Collins $MSG_shown[$hash] = true; 23081785fc73SJames Collins } 23091785fc73SJames Collins 23101785fc73SJames Collins unset($GLOBALS['MSG']); 23119cff245bSJames Collins }//end if 23121785fc73SJames Collins } 23137ac0a6efSJames Collins 23147ac0a6efSJames Collins /** 23157ac0a6efSJames Collins * Dokuwiki version 23167ac0a6efSJames Collins * 23177ac0a6efSJames Collins * @return string the dw version name 23187ac0a6efSJames Collins */ 23199cff245bSJames Collins public function dwVersion() 23209cff245bSJames Collins { 23219cff245bSJames Collins if (function_exists('getVersionData') === true) { 23227ac0a6efSJames Collins $version_data = getVersionData(); 23239cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 23247ac0a6efSJames Collins $version_items = explode(' ', $version_data['date']); 23257ac0a6efSJames Collins if (count($version_items) >= 2) { 23267ac0a6efSJames Collins return preg_replace('/[^a-zA-Z0-9 ]+/', '', strtolower($version_items[1])); 23277ac0a6efSJames Collins } 23287ac0a6efSJames Collins } 23297ac0a6efSJames Collins } 23307ac0a6efSJames Collins 23317ac0a6efSJames Collins return 'unknown'; 23327ac0a6efSJames Collins } 2333e4c4fb13SJames Collins 2334e4c4fb13SJames Collins /** 2335e4c4fb13SJames Collins * Dokuwiki version number 2336e4c4fb13SJames Collins * 2337e4c4fb13SJames Collins * @return string the dw version date converted to integer 2338e4c4fb13SJames Collins */ 23399cff245bSJames Collins public function dwVersionNumber() 23409cff245bSJames Collins { 23419cff245bSJames Collins if (function_exists('getVersionData') === true) { 2342e4c4fb13SJames Collins $version_data = getVersionData(); 23439cff245bSJames Collins if (is_array($version_data) === true && array_key_exists('date', $version_data) === true) { 2344e4c4fb13SJames Collins $version_items = explode(' ', $version_data['date']); 2345e4c4fb13SJames Collins if (count($version_items) >= 1) { 2346e4c4fb13SJames Collins return intval(preg_replace('/[^0-9]+/', '', strtolower($version_items[0]))); 2347e4c4fb13SJames Collins } 2348e4c4fb13SJames Collins } 2349e4c4fb13SJames Collins } 2350e4c4fb13SJames Collins 2351e4c4fb13SJames Collins return 0; 2352e4c4fb13SJames Collins } 2353a8eebd82SJames Collins} 2354ab45ba71SJames Collins 2355ab45ba71SJames Collinsglobal $TEMPLATE; 235647161538SJames Collins$TEMPLATE = \dokuwiki\template\mikio\Template::getInstance(); 2357