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