104fd306cSNickeau<?php 204fd306cSNickeau 304fd306cSNickeaunamespace ComboStrap; 404fd306cSNickeau 504fd306cSNickeau 604fd306cSNickeauuse ComboStrap\Meta\Field\PageTemplateName; 704fd306cSNickeauuse dokuwiki\Extension\PluginTrait; 804fd306cSNickeau 904fd306cSNickeauclass SiteConfig 1004fd306cSNickeau{ 1104fd306cSNickeau const LOG_EXCEPTION_LEVEL = 'log-exception-level'; 1204fd306cSNickeau 1304fd306cSNickeau /** 1404fd306cSNickeau * A configuration to enable the theme/template system 1504fd306cSNickeau */ 1604fd306cSNickeau public const CONF_ENABLE_THEME_SYSTEM = "combo-conf-001"; 1704fd306cSNickeau public const CONF_ENABLE_THEME_SYSTEM_DEFAULT = 1; 1804fd306cSNickeau 1904fd306cSNickeau /** 2004fd306cSNickeau * The default font-size for the pages 2104fd306cSNickeau */ 2204fd306cSNickeau const REM_CONF = "combo-conf-002"; 2304fd306cSNickeau const REM_CANONICAL = "rfs"; 2404fd306cSNickeau 2504fd306cSNickeau /** 2604fd306cSNickeau * The maximum size to be embedded 2704fd306cSNickeau * Above this size limit they are fetched 2804fd306cSNickeau * 2904fd306cSNickeau * 2kb is too small for icon. 3004fd306cSNickeau * For instance, the et:twitter is 2,600b 3104fd306cSNickeau */ 3204fd306cSNickeau public const HTML_MAX_KB_SIZE_FOR_INLINE_ELEMENT = "combo-conf-003"; 3304fd306cSNickeau public const HTML_MAX_KB_SIZE_FOR_INLINE_ELEMENT_DEFAULT = 4; 3404fd306cSNickeau /** 3504fd306cSNickeau * Private configuration used in test 3604fd306cSNickeau * When set to true, all javascript snippet will be inlined 3704fd306cSNickeau */ 3804fd306cSNickeau public const HTML_ALWAYS_INLINE_LOCAL_JAVASCRIPT = "combo-conf-004"; 3904fd306cSNickeau const CANONICAL = "site-config"; 4004fd306cSNickeau const GLOBAL_SCOPE = null; 4104fd306cSNickeau /** 4204fd306cSNickeau * The default name 4304fd306cSNickeau */ 4404fd306cSNickeau public const CONF_DEFAULT_INDEX_NAME = "start"; 4504fd306cSNickeau 4604fd306cSNickeau 4704fd306cSNickeau /** 4804fd306cSNickeau * @var WikiPath the {@link self::getContextPath()} when no context could be determined 4904fd306cSNickeau */ 5004fd306cSNickeau private WikiPath $defaultContextPath; 5104fd306cSNickeau 52*70bbd7f1Sgerardnico private array $authorizedUrlSchemes; 53*70bbd7f1Sgerardnico 5404fd306cSNickeau /** 5504fd306cSNickeau * @var array - the configuration value to restore 5604fd306cSNickeau * 5704fd306cSNickeau * Note we can't capture the whole global $conf 5804fd306cSNickeau * because the configuration are loaded at runtime via {@link PluginTrait::loadConfig()} 5904fd306cSNickeau * 6004fd306cSNickeau * Meaning that the configuration environment at the start is not fully loaded 6104fd306cSNickeau * and does not represent the environment totally 6204fd306cSNickeau * 6304fd306cSNickeau * We capture then the change and restore them at the end 6404fd306cSNickeau */ 6504fd306cSNickeau private array $configurationValuesToRestore = []; 6604fd306cSNickeau private ExecutionContext $executionContext; 6704fd306cSNickeau private array $interWikis; 6804fd306cSNickeau 6904fd306cSNickeau /** 7004fd306cSNickeau * @param ExecutionContext $executionContext 7104fd306cSNickeau */ 7204fd306cSNickeau public function __construct(ExecutionContext $executionContext) 7304fd306cSNickeau { 7404fd306cSNickeau $this->executionContext = $executionContext; 7504fd306cSNickeau } 7604fd306cSNickeau 7704fd306cSNickeau /** 7804fd306cSNickeau * TODO: Default: Note that the config of plugin are loaded 7904fd306cSNickeau * via {@link PluginTrait::loadConfig()} 8004fd306cSNickeau * when {@link PluginTrait::getConf()} is used 8104fd306cSNickeau * Therefore whenever possible, for now {@link PluginTrait::getConf()} 8204fd306cSNickeau * should be used otherwise, there is no default 8304fd306cSNickeau * Or best, the default should be also in the code 8404fd306cSNickeau * 8504fd306cSNickeau */ 8604fd306cSNickeau public static function getConfValue($confName, $defaultValue = null, ?string $namespace = PluginUtility::PLUGIN_BASE_NAME) 8704fd306cSNickeau { 8804fd306cSNickeau global $conf; 8904fd306cSNickeau if ($namespace !== null) { 9004fd306cSNickeau 916b325b4bSgerardnico $namespace = $conf['plugin'][$namespace] ?? null; 926b325b4bSgerardnico if ($namespace === null) { 936b325b4bSgerardnico return $defaultValue; 946b325b4bSgerardnico } 9506ecf9e7Sgerardnico $value = $namespace[$confName] ?? null; 966b325b4bSgerardnico 9704fd306cSNickeau } else { 986b325b4bSgerardnico 996b325b4bSgerardnico $value = $conf[$confName] ?? null; 1006b325b4bSgerardnico 10104fd306cSNickeau } 10204fd306cSNickeau if (DataType::isBoolean($value)) { 10304fd306cSNickeau /** 10404fd306cSNickeau * Because the next line 10504fd306cSNickeau * `trim($value) === ""` 10604fd306cSNickeau * is true for a false value 10704fd306cSNickeau */ 10804fd306cSNickeau return $value; 10904fd306cSNickeau } 11004fd306cSNickeau if ($value === null || trim($value) === "") { 11104fd306cSNickeau return $defaultValue; 11204fd306cSNickeau } 11304fd306cSNickeau return $value; 11404fd306cSNickeau } 11504fd306cSNickeau 11604fd306cSNickeau 11704fd306cSNickeau /** 11804fd306cSNickeau * @param string $key 11904fd306cSNickeau * @param $value 12004fd306cSNickeau * @param string|null $pluginNamespace - null for the global namespace 12104fd306cSNickeau * @return $this 12204fd306cSNickeau */ 12304fd306cSNickeau public function setConf(string $key, $value, ?string $pluginNamespace = PluginUtility::PLUGIN_BASE_NAME): SiteConfig 12404fd306cSNickeau { 12504fd306cSNickeau /** 12604fd306cSNickeau * Environment within dokuwiki is a global variable 12704fd306cSNickeau * 12804fd306cSNickeau * We set it the global variable 12904fd306cSNickeau * 13004fd306cSNickeau * but we capture it {@link ExecutionContext::$capturedConf} 13104fd306cSNickeau * to restore it when the execution context os {@link ExecutionContext::close()} 13204fd306cSNickeau */ 13304fd306cSNickeau $globalKey = "$pluginNamespace:$key"; 13404fd306cSNickeau if (!isset($this->configurationValuesToRestore[$globalKey])) { 13504fd306cSNickeau $oldValue = self::getConfValue($key, $value, $pluginNamespace); 13604fd306cSNickeau $this->configurationValuesToRestore[$globalKey] = $oldValue; 13704fd306cSNickeau } 13804fd306cSNickeau Site::setConf($key, $value, $pluginNamespace); 13904fd306cSNickeau return $this; 14004fd306cSNickeau } 14104fd306cSNickeau 14204fd306cSNickeau /** 14304fd306cSNickeau * Restore the configuration 14404fd306cSNickeau * as it was when php started 14504fd306cSNickeau * @return void 14604fd306cSNickeau */ 14704fd306cSNickeau public function restoreConfigState() 14804fd306cSNickeau { 14904fd306cSNickeau 15004fd306cSNickeau foreach ($this->configurationValuesToRestore as $guid => $value) { 15104fd306cSNickeau [$plugin, $confKey] = explode(":", $guid); 15204fd306cSNickeau Site::setConf($confKey, $value, $plugin); 15304fd306cSNickeau } 15404fd306cSNickeau } 15504fd306cSNickeau 15604fd306cSNickeau public function setDisableThemeSystem(): SiteConfig 15704fd306cSNickeau { 15804fd306cSNickeau $this->setConf(self::CONF_ENABLE_THEME_SYSTEM, 0); 15904fd306cSNickeau return $this; 16004fd306cSNickeau } 16104fd306cSNickeau 16204fd306cSNickeau public function isThemeSystemEnabled(): bool 16304fd306cSNickeau { 16404fd306cSNickeau return $this->getBooleanValue(self::CONF_ENABLE_THEME_SYSTEM, self::CONF_ENABLE_THEME_SYSTEM_DEFAULT); 16504fd306cSNickeau } 16604fd306cSNickeau 16704fd306cSNickeau public function getValue(string $key, ?string $default = null, ?string $scope = PluginUtility::PLUGIN_BASE_NAME) 16804fd306cSNickeau { 16904fd306cSNickeau return self::getConfValue($key, $default, $scope); 17004fd306cSNickeau } 17104fd306cSNickeau 17204fd306cSNickeau /** 17304fd306cSNickeau * @param string $key 17404fd306cSNickeau * @param int $default - the default value (1=true,0=false in the dokuwiki config system) 17504fd306cSNickeau * @return bool 17604fd306cSNickeau */ 17704fd306cSNickeau public function getBooleanValue(string $key, int $default): bool 17804fd306cSNickeau { 17904fd306cSNickeau $value = $this->getValue($key, $default); 18004fd306cSNickeau /** 18104fd306cSNickeau * Boolean in config is normally the value 1 18204fd306cSNickeau */ 18304fd306cSNickeau return DataType::toBoolean($value); 18404fd306cSNickeau } 18504fd306cSNickeau 18604fd306cSNickeau public function setCacheXhtmlOn() 18704fd306cSNickeau { 18804fd306cSNickeau // ensure the value is not -1, which disables caching 18904fd306cSNickeau // https://www.dokuwiki.org/config:cachetime 19004fd306cSNickeau 19104fd306cSNickeau $this->setConf('cachetime', 60 * 60, null); 19204fd306cSNickeau return $this; 19304fd306cSNickeau } 19404fd306cSNickeau 19504fd306cSNickeau public function setConsoleOn(): SiteConfig 19604fd306cSNickeau { 19704fd306cSNickeau $this->setConf('console', 1); 19804fd306cSNickeau return $this; 19904fd306cSNickeau } 20004fd306cSNickeau 20104fd306cSNickeau public function isConsoleOn(): bool 20204fd306cSNickeau { 20304fd306cSNickeau return $this->getBooleanValue('console', 0); 20404fd306cSNickeau } 20504fd306cSNickeau 20604fd306cSNickeau public function getExecutionContext(): ExecutionContext 20704fd306cSNickeau { 20804fd306cSNickeau return $this->executionContext; 20904fd306cSNickeau } 21004fd306cSNickeau 21104fd306cSNickeau public function setConsoleOff(): SiteConfig 21204fd306cSNickeau { 21304fd306cSNickeau $this->setConf('console', 0); 21404fd306cSNickeau return $this; 21504fd306cSNickeau } 21604fd306cSNickeau 21704fd306cSNickeau public function setLogExceptionToError(): SiteConfig 21804fd306cSNickeau { 21904fd306cSNickeau $this->setLogExceptionLevel(LogUtility::LVL_MSG_ERROR); 22004fd306cSNickeau return $this; 22104fd306cSNickeau } 22204fd306cSNickeau 22304fd306cSNickeau public function setDisableLogException(): SiteConfig 22404fd306cSNickeau { 22504fd306cSNickeau $this->setLogExceptionLevel(LogUtility::LVL_MSG_ABOVE_ERROR); 22604fd306cSNickeau return $this; 22704fd306cSNickeau } 22804fd306cSNickeau 22904fd306cSNickeau public function setLogExceptionLevel(int $level): SiteConfig 23004fd306cSNickeau { 23104fd306cSNickeau $this->setConf(self::LOG_EXCEPTION_LEVEL, $level); 23204fd306cSNickeau return $this; 23304fd306cSNickeau } 23404fd306cSNickeau 23504fd306cSNickeau public function getLogExceptionLevel(): int 23604fd306cSNickeau { 23704fd306cSNickeau return $this->getValue(self::LOG_EXCEPTION_LEVEL, LogUtility::DEFAULT_THROW_LEVEL); 23804fd306cSNickeau } 23904fd306cSNickeau 24004fd306cSNickeau /** 24104fd306cSNickeau * @throws ExceptionNotFound 24204fd306cSNickeau */ 24304fd306cSNickeau public function getRemFontSize(): int 24404fd306cSNickeau { 24504fd306cSNickeau 24604fd306cSNickeau $value = $this->getValue(self::REM_CONF); 24704fd306cSNickeau if ($value === null) { 24804fd306cSNickeau throw new ExceptionNotFound("No rem sized defined"); 24904fd306cSNickeau } 25004fd306cSNickeau try { 25104fd306cSNickeau return DataType::toInteger($value); 25204fd306cSNickeau } catch (ExceptionCompile $e) { 25304fd306cSNickeau $message = "The rem configuration value ($value) is not a integer. Error: {$e->getMessage()}"; 25404fd306cSNickeau LogUtility::msg($message); 25504fd306cSNickeau throw new ExceptionNotFound($message); 25604fd306cSNickeau } 25704fd306cSNickeau 25804fd306cSNickeau } 25904fd306cSNickeau 26004fd306cSNickeau public function setDefaultContextPath(WikiPath $contextPath) 26104fd306cSNickeau { 26204fd306cSNickeau $this->defaultContextPath = $contextPath; 26304fd306cSNickeau if (FileSystems::isDirectory($this->defaultContextPath)) { 26404fd306cSNickeau /** 26504fd306cSNickeau * Not a directory. 26604fd306cSNickeau * 26704fd306cSNickeau * If the link or path is the empty path, the path is not the directory 26804fd306cSNickeau * but the actual markup 26904fd306cSNickeau */ 27004fd306cSNickeau throw new ExceptionRuntimeInternal("The path ($contextPath) should not be a namespace path"); 27104fd306cSNickeau } 27204fd306cSNickeau return $this; 27304fd306cSNickeau } 27404fd306cSNickeau 27504fd306cSNickeau /** 27604fd306cSNickeau * @return WikiPath - the default context path is if not set the root page 27704fd306cSNickeau */ 27804fd306cSNickeau public function getDefaultContextPath(): WikiPath 27904fd306cSNickeau { 28004fd306cSNickeau if (isset($this->defaultContextPath)) { 28104fd306cSNickeau return $this->defaultContextPath; 28204fd306cSNickeau } 28304fd306cSNickeau // in a admin or dynamic rendering 28404fd306cSNickeau // dokuwiki may have set a $ID 28504fd306cSNickeau global $ID; 28604fd306cSNickeau if (isset($ID)) { 28704fd306cSNickeau return WikiPath::createMarkupPathFromId($ID); 28804fd306cSNickeau } 28904fd306cSNickeau return WikiPath::createRootNamespacePathOnMarkupDrive()->resolve(Site::getIndexPageName() . "." . WikiPath::MARKUP_DEFAULT_TXT_EXTENSION); 29004fd306cSNickeau } 29104fd306cSNickeau 29204fd306cSNickeau public function getHtmlMaxInlineResourceSize() 29304fd306cSNickeau { 29404fd306cSNickeau try { 29504fd306cSNickeau return DataType::toInteger($this->getValue(SiteConfig::HTML_MAX_KB_SIZE_FOR_INLINE_ELEMENT, self::HTML_MAX_KB_SIZE_FOR_INLINE_ELEMENT_DEFAULT)) * 1024; 29604fd306cSNickeau } catch (ExceptionBadArgument $e) { 29704fd306cSNickeau LogUtility::internalError("Max in line size error.", self::CANONICAL, $e); 29804fd306cSNickeau return self::HTML_MAX_KB_SIZE_FOR_INLINE_ELEMENT_DEFAULT * 1024; 29904fd306cSNickeau } 30004fd306cSNickeau } 30104fd306cSNickeau 30204fd306cSNickeau public function setHtmlMaxInlineResourceSize(int $kbSize): SiteConfig 30304fd306cSNickeau { 30404fd306cSNickeau $this->setConf(SiteConfig::HTML_MAX_KB_SIZE_FOR_INLINE_ELEMENT, $kbSize); 30504fd306cSNickeau return $this; 30604fd306cSNickeau } 30704fd306cSNickeau 30804fd306cSNickeau public function setDisableHeadingSectionEditing(): SiteConfig 30904fd306cSNickeau { 31004fd306cSNickeau $this->setConf('maxseclevel', 0, null); 31104fd306cSNickeau return $this; 31204fd306cSNickeau } 31304fd306cSNickeau 31404fd306cSNickeau public function setHtmlEnableAlwaysInlineLocalJavascript(): SiteConfig 31504fd306cSNickeau { 31604fd306cSNickeau $this->setConf(self::HTML_ALWAYS_INLINE_LOCAL_JAVASCRIPT, 1); 31704fd306cSNickeau return $this; 31804fd306cSNickeau } 31904fd306cSNickeau 32004fd306cSNickeau public function setHtmlDisableAlwaysInlineLocalJavascript(): SiteConfig 32104fd306cSNickeau { 32204fd306cSNickeau $this->setConf(self::HTML_ALWAYS_INLINE_LOCAL_JAVASCRIPT, 0); 32304fd306cSNickeau return $this; 32404fd306cSNickeau } 32504fd306cSNickeau 32604fd306cSNickeau public function isLocalJavascriptAlwaysInlined(): bool 32704fd306cSNickeau { 32804fd306cSNickeau return $this->getBooleanValue(self::HTML_ALWAYS_INLINE_LOCAL_JAVASCRIPT, 0); 32904fd306cSNickeau } 33004fd306cSNickeau 33104fd306cSNickeau 33204fd306cSNickeau public function disableLazyLoad(): SiteConfig 33304fd306cSNickeau { 33404fd306cSNickeau return $this->setConf(SvgImageLink::CONF_LAZY_LOAD_ENABLE, 0) 33504fd306cSNickeau ->setConf(LazyLoad::CONF_RASTER_ENABLE, 0); 33604fd306cSNickeau 33704fd306cSNickeau } 33804fd306cSNickeau 33904fd306cSNickeau public function setUseHeadingAsTitle(): SiteConfig 34004fd306cSNickeau { 34104fd306cSNickeau return $this->setConf('useheading', 1, self::GLOBAL_SCOPE); 34204fd306cSNickeau } 34304fd306cSNickeau 34404fd306cSNickeau public function setEnableSectionEditing(): SiteConfig 34504fd306cSNickeau { 34604fd306cSNickeau return $this->setConf('maxseclevel', 999, self::GLOBAL_SCOPE); 34704fd306cSNickeau } 34804fd306cSNickeau 34904fd306cSNickeau public function isSectionEditingEnabled(): bool 35004fd306cSNickeau { 35104fd306cSNickeau return $this->getTocMaxLevel() > 0; 35204fd306cSNickeau } 35304fd306cSNickeau 35404fd306cSNickeau public function getTocMaxLevel(): int 35504fd306cSNickeau { 35604fd306cSNickeau $value = $this->getValue('maxseclevel', null, self::GLOBAL_SCOPE); 35704fd306cSNickeau try { 35804fd306cSNickeau return DataType::toInteger($value); 35904fd306cSNickeau } catch (ExceptionBadArgument $e) { 36004fd306cSNickeau LogUtility::internalError("Unable to the the maxseclevel as integer. Error: {$e->getMessage()}", Toc::CANONICAL); 36104fd306cSNickeau return 0; 36204fd306cSNickeau } 36304fd306cSNickeau } 36404fd306cSNickeau 36504fd306cSNickeau public function setTocMinHeading(int $int): SiteConfig 36604fd306cSNickeau { 36704fd306cSNickeau return $this->setConf('tocminheads', $int, self::GLOBAL_SCOPE); 36804fd306cSNickeau } 36904fd306cSNickeau 37004fd306cSNickeau public function getIndexPageName() 37104fd306cSNickeau { 37204fd306cSNickeau return $this->getValue("start", self::CONF_DEFAULT_INDEX_NAME, self::GLOBAL_SCOPE); 37304fd306cSNickeau } 37404fd306cSNickeau 37504fd306cSNickeau public function getAuthorizedUrlSchemes(): ?array 37604fd306cSNickeau { 37704fd306cSNickeau if (isset($this->authorizedUrlSchemes)) { 37804fd306cSNickeau return $this->authorizedUrlSchemes; 37904fd306cSNickeau } 38004fd306cSNickeau $this->authorizedUrlSchemes = getSchemes(); 38104fd306cSNickeau $this->authorizedUrlSchemes[] = "whatsapp"; 38204fd306cSNickeau $this->authorizedUrlSchemes[] = "mailto"; 38304fd306cSNickeau return $this->authorizedUrlSchemes; 38404fd306cSNickeau } 38504fd306cSNickeau 38604fd306cSNickeau public function getInterWikis(): array 38704fd306cSNickeau { 38804fd306cSNickeau $this->loadInterWikiIfNeeded(); 38904fd306cSNickeau return $this->interWikis; 39004fd306cSNickeau } 39104fd306cSNickeau 39204fd306cSNickeau public function addInterWiki(string $name, string $value): SiteConfig 39304fd306cSNickeau { 39404fd306cSNickeau $this->loadInterWikiIfNeeded(); 39504fd306cSNickeau $this->interWikis[$name] = $value; 39604fd306cSNickeau return $this; 39704fd306cSNickeau } 39804fd306cSNickeau 39904fd306cSNickeau private function loadInterWikiIfNeeded(): void 40004fd306cSNickeau { 40104fd306cSNickeau if (isset($this->interWikis)) { 40204fd306cSNickeau return; 40304fd306cSNickeau } 40404fd306cSNickeau $this->interWikis = getInterwiki(); 40504fd306cSNickeau } 40604fd306cSNickeau 40704fd306cSNickeau public function setTocTopLevel(int $int): SiteConfig 40804fd306cSNickeau { 40904fd306cSNickeau return $this->setConf('toptoclevel', $int, self::GLOBAL_SCOPE); 41004fd306cSNickeau } 41104fd306cSNickeau 41204fd306cSNickeau public function getMetaDataDirectory(): LocalPath 41304fd306cSNickeau { 41404fd306cSNickeau $metadataDirectory = $this->getValue('metadir', null, self::GLOBAL_SCOPE); 41504fd306cSNickeau if ($metadataDirectory === null) { 41604fd306cSNickeau throw new ExceptionRuntime("The meta directory configuration value ('metadir') is null"); 41704fd306cSNickeau } 41804fd306cSNickeau return LocalPath::createFromPathString($metadataDirectory); 41904fd306cSNickeau } 42004fd306cSNickeau 42104fd306cSNickeau public function setCanonicalUrlType(string $value): SiteConfig 42204fd306cSNickeau { 42304fd306cSNickeau return $this->setConf(PageUrlType::CONF_CANONICAL_URL_TYPE, $value); 42404fd306cSNickeau } 42504fd306cSNickeau 42604fd306cSNickeau public function setEnableTheming(): SiteConfig 42704fd306cSNickeau { 42804fd306cSNickeau $this->setConf(SiteConfig::CONF_ENABLE_THEME_SYSTEM, 1); 42904fd306cSNickeau return $this; 43004fd306cSNickeau } 43104fd306cSNickeau 43204fd306cSNickeau public function getTheme(): string 43304fd306cSNickeau { 43404fd306cSNickeau return $this->getValue(TemplateEngine::CONF_THEME, TemplateEngine::CONF_THEME_DEFAULT); 43504fd306cSNickeau } 43604fd306cSNickeau 43704fd306cSNickeau /** 43804fd306cSNickeau * Note: in test to speed the test execution, 43904fd306cSNickeau * the default is set to {@link PageTemplateName::BLANK_TEMPLATE_VALUE} 44004fd306cSNickeau */ 44104fd306cSNickeau public function getDefaultLayoutName() 44204fd306cSNickeau { 44304fd306cSNickeau return $this->getValue(PageTemplateName::CONF_DEFAULT_NAME, PageTemplateName::HOLY_TEMPLATE_VALUE); 44404fd306cSNickeau } 44504fd306cSNickeau 44604fd306cSNickeau public function setEnableThemeSystem(): SiteConfig 44704fd306cSNickeau { 44804fd306cSNickeau // this is the default but yeah 44904fd306cSNickeau $this->setConf(self::CONF_ENABLE_THEME_SYSTEM, 1); 45004fd306cSNickeau return $this; 45104fd306cSNickeau } 45204fd306cSNickeau 45304fd306cSNickeau /** 45404fd306cSNickeau * DokuRewrite 45504fd306cSNickeau * `doku.php/id/...` 45604fd306cSNickeau * https://www.dokuwiki.org/config:userewrite 45704fd306cSNickeau * @return $this 45804fd306cSNickeau */ 45904fd306cSNickeau public function setUrlRewriteToDoku(): SiteConfig 46004fd306cSNickeau { 46104fd306cSNickeau $this->setConf('userewrite', '2', self::GLOBAL_SCOPE); 46204fd306cSNickeau return $this; 46304fd306cSNickeau } 46404fd306cSNickeau 46504fd306cSNickeau /** 46604fd306cSNickeau * Web server rewrite (Apache rewrite (htaccess), Nginx) 46704fd306cSNickeau * https://www.dokuwiki.org/config:userewrite 46804fd306cSNickeau * @return $this 46904fd306cSNickeau */ 47004fd306cSNickeau public function setUrlRewriteToWebServer(): SiteConfig 47104fd306cSNickeau { 47204fd306cSNickeau $this->setConf('userewrite', '1', self::GLOBAL_SCOPE); 47304fd306cSNickeau return $this; 47404fd306cSNickeau } 47504fd306cSNickeau 47604fd306cSNickeau public function getRemFontSizeOrDefault(): int 47704fd306cSNickeau { 47804fd306cSNickeau try { 47904fd306cSNickeau return $this->getRemFontSize(); 48004fd306cSNickeau } catch (ExceptionNotFound $e) { 48104fd306cSNickeau return 16; 48204fd306cSNickeau } 48304fd306cSNickeau } 48404fd306cSNickeau 48504fd306cSNickeau public function getDataDirectory(): LocalPath 48604fd306cSNickeau { 48704fd306cSNickeau global $conf; 48804fd306cSNickeau $dataDirectory = $conf['savedir']; 48904fd306cSNickeau if ($dataDirectory === null) { 49004fd306cSNickeau throw new ExceptionRuntime("The data directory ($dataDirectory) is null"); 49104fd306cSNickeau } 49204fd306cSNickeau return LocalPath::createFromPathString($dataDirectory); 49304fd306cSNickeau } 49404fd306cSNickeau 49504fd306cSNickeau public function setTheme(string $themeName): SiteConfig 49604fd306cSNickeau { 49704fd306cSNickeau $this->setConf(TemplateEngine::CONF_THEME, $themeName); 49804fd306cSNickeau return $this; 49904fd306cSNickeau } 50004fd306cSNickeau 50104fd306cSNickeau public function getPageHeaderSlotName() 50204fd306cSNickeau { 50304fd306cSNickeau return $this->getValue(TemplateSlot::CONF_PAGE_HEADER_NAME, TemplateSlot::CONF_PAGE_HEADER_NAME_DEFAULT); 50404fd306cSNickeau } 50504fd306cSNickeau 50604fd306cSNickeau public function setConfDokuWiki(string $key, $value): SiteConfig 50704fd306cSNickeau { 50804fd306cSNickeau return $this->setConf($key, $value, self::GLOBAL_SCOPE); 50904fd306cSNickeau } 51004fd306cSNickeau 51104fd306cSNickeau /** 51204fd306cSNickeau * @throws ExceptionNotFound 51304fd306cSNickeau */ 51404fd306cSNickeau public function getPrimaryColor(): ColorRgb 51504fd306cSNickeau { 51604fd306cSNickeau $value = Site::getPrimaryColorValue(); 51704fd306cSNickeau if ( 51804fd306cSNickeau $value === null || 51904fd306cSNickeau (trim($value) === "")) { 52004fd306cSNickeau throw new ExceptionNotFound(); 52104fd306cSNickeau } 52204fd306cSNickeau try { 52304fd306cSNickeau return ColorRgb::createFromString($value); 52404fd306cSNickeau } catch (ExceptionCompile $e) { 52504fd306cSNickeau LogUtility::msg("The primary color value configuration ($value) is not valid. Error: {$e->getMessage()}"); 52604fd306cSNickeau throw new ExceptionNotFound(); 52704fd306cSNickeau } 52804fd306cSNickeau } 52904fd306cSNickeau 53004fd306cSNickeau public function setPrimaryColor(string $primaryColorValue): SiteConfig 53104fd306cSNickeau { 53204fd306cSNickeau self::setConf(BrandingColors::PRIMARY_COLOR_CONF, $primaryColorValue); 53304fd306cSNickeau return $this; 53404fd306cSNickeau } 53504fd306cSNickeau 53604fd306cSNickeau public function getPrimaryColorOrDefault(string $defaultColor): ColorRgb 53704fd306cSNickeau { 53804fd306cSNickeau try { 53904fd306cSNickeau return $this->getPrimaryColor(); 54004fd306cSNickeau } catch (ExceptionNotFound $e) { 54104fd306cSNickeau try { 54204fd306cSNickeau return ColorRgb::createFromString($defaultColor); 54304fd306cSNickeau } catch (ExceptionBadArgument $e) { 54404fd306cSNickeau LogUtility::internalError("The default color $defaultColor is not a color string.", self::CANONICAL, $e); 54504fd306cSNickeau return ColorRgb::getDefaultPrimary(); 54604fd306cSNickeau } 54704fd306cSNickeau } 54804fd306cSNickeau } 54904fd306cSNickeau 55004fd306cSNickeau public function isBrandingColorInheritanceEnabled(): bool 55104fd306cSNickeau { 55204fd306cSNickeau return $this->getValue(BrandingColors::BRANDING_COLOR_INHERITANCE_ENABLE_CONF, BrandingColors::BRANDING_COLOR_INHERITANCE_ENABLE_CONF_DEFAULT) === 1; 55304fd306cSNickeau } 55404fd306cSNickeau 55504fd306cSNickeau /** 55604fd306cSNickeau * @throws ExceptionNotFound 55704fd306cSNickeau */ 55804fd306cSNickeau public function getSecondaryColor(): ColorRgb 55904fd306cSNickeau { 56004fd306cSNickeau $secondaryColor = Site::getSecondaryColor(); 56104fd306cSNickeau if ($secondaryColor === null) { 56204fd306cSNickeau throw new ExceptionNotFound(); 56304fd306cSNickeau } 56404fd306cSNickeau return $secondaryColor; 56504fd306cSNickeau } 56604fd306cSNickeau 56704fd306cSNickeau public function isXhtmlCacheOn(): bool 56804fd306cSNickeau { 56904fd306cSNickeau global $conf; 57004fd306cSNickeau return $conf['cachetime'] !== -1; 57104fd306cSNickeau } 57204fd306cSNickeau 57304fd306cSNickeau 57404fd306cSNickeau} 575