xref: /template/strap/ComboStrap/SiteConfig.php (revision 70bbd7f1f72440223cc13f3495efdcb2b0a11514)
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