xref: /template/strap/ComboStrap/Site.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
137748cd8SNickeau<?php
237748cd8SNickeau/**
337748cd8SNickeau * Copyright (c) 2021. ComboStrap, Inc. and its affiliates. All Rights Reserved.
437748cd8SNickeau *
537748cd8SNickeau * This source code is licensed under the GPL license found in the
637748cd8SNickeau * COPYING  file in the root directory of this source tree.
737748cd8SNickeau *
837748cd8SNickeau * @license  GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html)
937748cd8SNickeau * @author   ComboStrap <support@combostrap.com>
1037748cd8SNickeau *
1137748cd8SNickeau */
1237748cd8SNickeau
1337748cd8SNickeaunamespace ComboStrap;
1437748cd8SNickeau
1537748cd8SNickeau
16*04fd306cSNickeauuse ComboStrap\Meta\Field\PageTemplateName;
17*04fd306cSNickeauuse ComboStrap\Meta\Field\Region;
18*04fd306cSNickeauuse ComboStrap\Web\Url;
19*04fd306cSNickeauuse ComboStrap\Web\UrlRewrite;
2082a60d03SNickeauuse Exception;
21c3437056SNickeau
2237748cd8SNickeauclass Site
2337748cd8SNickeau{
2437748cd8SNickeau
2537748cd8SNickeau    const STRAP_TEMPLATE_NAME = "strap";
2637748cd8SNickeau
2737748cd8SNickeau    const SVG_LOGO_IDS = array(
28*04fd306cSNickeau        'wiki:logo.svg',
29*04fd306cSNickeau        'logo.svg'
3037748cd8SNickeau    );
3137748cd8SNickeau
3237748cd8SNickeau    const PNG_LOGO_IDS = array(
33*04fd306cSNickeau        'logo.png',
34*04fd306cSNickeau        'wiki:logo.png',
35*04fd306cSNickeau        'favicon-32×32.png',
36*04fd306cSNickeau        'favicon-16×16.png',
37*04fd306cSNickeau        'apple-touch-icon.png',
38*04fd306cSNickeau        'android-chrome-192x192.png'
3937748cd8SNickeau    );
40*04fd306cSNickeau    /**
41*04fd306cSNickeau     * Name of the main header slot
42*04fd306cSNickeau     */
43*04fd306cSNickeau    public const SLOT_MAIN_HEADER_NAME = "slot_main_header";
44*04fd306cSNickeau    /**
45*04fd306cSNickeau     * Name of the main footer slot
46*04fd306cSNickeau     */
47*04fd306cSNickeau    public const SLOT_MAIN_FOOTER_NAME = "slot_main_footer";
48*04fd306cSNickeau
49*04fd306cSNickeau    public const SLOT_MAIN_SIDE_NAME = "slot_main_side";
50*04fd306cSNickeau
51*04fd306cSNickeau    const CANONICAL = "configuration";
52*04fd306cSNickeau    /**
53*04fd306cSNickeau     * Strap Template meta (version, release date, ...)
54*04fd306cSNickeau     * @var array
55*04fd306cSNickeau     */
56*04fd306cSNickeau    private static $STRAP_TEMPLATE_INFO;
57*04fd306cSNickeau    private $executingContext;
58*04fd306cSNickeau
59*04fd306cSNickeau    /**
60*04fd306cSNickeau     * @param ExecutionContext $executingContext
61*04fd306cSNickeau     */
62*04fd306cSNickeau    public function __construct(ExecutionContext $executingContext)
63*04fd306cSNickeau    {
64*04fd306cSNickeau        $this->executingContext = $executingContext;
65*04fd306cSNickeau    }
6637748cd8SNickeau
6737748cd8SNickeau
6837748cd8SNickeau    /**
69*04fd306cSNickeau     * @return WikiPath[]
701fa8c418SNickeau     */
71*04fd306cSNickeau    public static function getLogoImagesAsPath(): array
7237748cd8SNickeau    {
731fa8c418SNickeau        $logosPaths = PluginUtility::mergeAttributes(self::PNG_LOGO_IDS, self::SVG_LOGO_IDS);
741fa8c418SNickeau        $logos = [];
751fa8c418SNickeau        foreach ($logosPaths as $logoPath) {
76*04fd306cSNickeau            $dokuPath = WikiPath::createMediaPathFromId($logoPath);
7782a60d03SNickeau            if (FileSystems::exists($dokuPath)) {
7882a60d03SNickeau                try {
79*04fd306cSNickeau                    $logos[] = $dokuPath;
8082a60d03SNickeau                } catch (Exception $e) {
8182a60d03SNickeau                    // The image is not valid
8282a60d03SNickeau                    LogUtility::msg("The logo ($logoPath) is not a valid image. {$e->getMessage()}");
8382a60d03SNickeau                }
8482a60d03SNickeau            }
851fa8c418SNickeau        }
861fa8c418SNickeau        return $logos;
8737748cd8SNickeau    }
8837748cd8SNickeau
89*04fd306cSNickeau    /**
90*04fd306cSNickeau     * @deprecated see {@link SiteConfig::setUrlRewriteToDoku()}
91*04fd306cSNickeau     */
92*04fd306cSNickeau    public static function setUrlRewriteToDoku()
93*04fd306cSNickeau    {
94*04fd306cSNickeau        ExecutionContext::getActualOrCreateFromEnv()->getConfig()
95*04fd306cSNickeau            ->setUrlRewriteToDoku();
96*04fd306cSNickeau    }
97*04fd306cSNickeau
98*04fd306cSNickeau    /**
99*04fd306cSNickeau     * Web server rewrite (Apache rewrite (htaccess), Nginx)
100*04fd306cSNickeau     * @deprecated see {@link SiteConfig::setUrlRewriteToWebServer()}
101*04fd306cSNickeau     */
102*04fd306cSNickeau    public static function setUrlRewriteToWebServer()
103*04fd306cSNickeau    {
104*04fd306cSNickeau        ExecutionContext::getActualOrCreateFromEnv()->getConfig()
105*04fd306cSNickeau            ->setUrlRewriteToWebServer();
106*04fd306cSNickeau    }
107*04fd306cSNickeau
108*04fd306cSNickeau    /**
109*04fd306cSNickeau     * https://www.dokuwiki.org/config:useslash
110*04fd306cSNickeau     * @return void
111*04fd306cSNickeau     */
112*04fd306cSNickeau    public static function useSlashSeparatorInEndpointUrl()
113*04fd306cSNickeau    {
114*04fd306cSNickeau        global $conf;
115*04fd306cSNickeau        $conf['useslash'] = 1; // use slash instead of ;
116*04fd306cSNickeau    }
117*04fd306cSNickeau
118*04fd306cSNickeau
119*04fd306cSNickeau    public static function getUrlEndpointSeparator(): string
120*04fd306cSNickeau    {
121*04fd306cSNickeau        $defaultSeparator = WikiPath::NAMESPACE_SEPARATOR_DOUBLE_POINT;
122*04fd306cSNickeau        $slashSeparator = "/";
123*04fd306cSNickeau        global $conf;
124*04fd306cSNickeau        $key = 'useslash';
125*04fd306cSNickeau        $value = $conf[$key];
126*04fd306cSNickeau        try {
127*04fd306cSNickeau            $valueInt = DataType::toInteger($value);
128*04fd306cSNickeau        } catch (ExceptionBadArgument $e) {
129*04fd306cSNickeau            LogUtility::internalError("The ($key) configuration does not have an integer value ($value). Default separator returned");
130*04fd306cSNickeau            return $defaultSeparator;
131*04fd306cSNickeau        }
132*04fd306cSNickeau        switch ($valueInt) {
133*04fd306cSNickeau            case 0:
134*04fd306cSNickeau                return $defaultSeparator;
135*04fd306cSNickeau            case 1:
136*04fd306cSNickeau                return $slashSeparator;
137*04fd306cSNickeau            default:
138*04fd306cSNickeau                LogUtility::internalError("The ($key) configuration has an integer value ($valueInt) that is not a valid one (0 or 1). Default separator returned");
139*04fd306cSNickeau                return $defaultSeparator;
140*04fd306cSNickeau        }
141*04fd306cSNickeau    }
142*04fd306cSNickeau
143*04fd306cSNickeau
144*04fd306cSNickeau    public static function getTocMinHeadings(): int
145*04fd306cSNickeau    {
146*04fd306cSNickeau        global $conf;
147*04fd306cSNickeau        $confKey = 'tocminheads';
148*04fd306cSNickeau        $tocMinHeads = $conf[$confKey];
149*04fd306cSNickeau        if ($tocMinHeads === null) {
150*04fd306cSNickeau            return 0;
151*04fd306cSNickeau        }
152*04fd306cSNickeau        try {
153*04fd306cSNickeau            return DataType::toInteger($tocMinHeads);
154*04fd306cSNickeau        } catch (ExceptionBadArgument $e) {
155*04fd306cSNickeau            LogUtility::error("The configuration ($confKey) is not an integer. Error:{$e->getMessage()}", self::CANONICAL);
156*04fd306cSNickeau            return 0;
157*04fd306cSNickeau        }
158*04fd306cSNickeau    }
159*04fd306cSNickeau
160*04fd306cSNickeau
161*04fd306cSNickeau    /**
162*04fd306cSNickeau     * @param int $int
163*04fd306cSNickeau     * @deprecated
164*04fd306cSNickeau     */
165*04fd306cSNickeau    public static function setTocMinHeading(int $int)
166*04fd306cSNickeau    {
167*04fd306cSNickeau        ExecutionContext::getActualOrCreateFromEnv()
168*04fd306cSNickeau            ->getConfig()
169*04fd306cSNickeau            ->setTocMinHeading($int);
170*04fd306cSNickeau    }
171*04fd306cSNickeau
172*04fd306cSNickeau    public static function getTopTocLevel(): int
173*04fd306cSNickeau    {
174*04fd306cSNickeau        global $conf;
175*04fd306cSNickeau        $confKey = 'toptoclevel';
176*04fd306cSNickeau        $value = $conf[$confKey];
177*04fd306cSNickeau        try {
178*04fd306cSNickeau            return DataType::toInteger($value);
179*04fd306cSNickeau        } catch (ExceptionBadArgument $e) {
180*04fd306cSNickeau            LogUtility::error("The configuration ($confKey) has a value ($value) that is not an integer", self::CANONICAL);
181*04fd306cSNickeau            return 1;
182*04fd306cSNickeau        }
183*04fd306cSNickeau    }
184*04fd306cSNickeau
185*04fd306cSNickeau    /**
186*04fd306cSNickeau     * @param int $int
187*04fd306cSNickeau     * @return void
188*04fd306cSNickeau     * @deprecated
189*04fd306cSNickeau     */
190*04fd306cSNickeau    public static function setTocTopLevel(int $int)
191*04fd306cSNickeau    {
192*04fd306cSNickeau        ExecutionContext::getActualOrCreateFromEnv()
193*04fd306cSNickeau            ->getConfig()
194*04fd306cSNickeau            ->setTocTopLevel($int);
195*04fd306cSNickeau
196*04fd306cSNickeau    }
197*04fd306cSNickeau
198*04fd306cSNickeau    /**
199*04fd306cSNickeau     * @return int
200*04fd306cSNickeau     * https://www.dokuwiki.org/config:breadcrumbs
201*04fd306cSNickeau     */
202*04fd306cSNickeau    public static function getVisitedPagesCountInHistoricalBreadCrumb(): int
203*04fd306cSNickeau    {
204*04fd306cSNickeau        global $conf;
205*04fd306cSNickeau        $confKey = 'breadcrumbs';
206*04fd306cSNickeau        $visitedPagesInBreadCrumb = $conf[$confKey];
207*04fd306cSNickeau        $defaultReturnValue = 10;
208*04fd306cSNickeau        if ($visitedPagesInBreadCrumb === null) {
209*04fd306cSNickeau            return $defaultReturnValue;
210*04fd306cSNickeau        }
211*04fd306cSNickeau        try {
212*04fd306cSNickeau            return DataType::toInteger($visitedPagesInBreadCrumb);
213*04fd306cSNickeau        } catch (ExceptionBadArgument $e) {
214*04fd306cSNickeau            LogUtility::error("The configuration ($confKey) has value ($visitedPagesInBreadCrumb) that is not an integer. Error:{$e->getMessage()}");
215*04fd306cSNickeau            return $defaultReturnValue;
216*04fd306cSNickeau        }
217*04fd306cSNickeau
218*04fd306cSNickeau    }
219*04fd306cSNickeau
220*04fd306cSNickeau    /**
221*04fd306cSNickeau     * This setting enables the standard DokuWiki XHTML renderer to be replaced by a render plugin that also provides XHTML output.
222*04fd306cSNickeau     * @param string $string
223*04fd306cSNickeau     * @return void
224*04fd306cSNickeau     */
225*04fd306cSNickeau    public static function setXhtmlRenderer(string $string)
226*04fd306cSNickeau    {
227*04fd306cSNickeau        global $conf;
228*04fd306cSNickeau        $conf["renderer_xhtml"] = $string;
229*04fd306cSNickeau    }
230*04fd306cSNickeau
231*04fd306cSNickeau    /**
232*04fd306cSNickeau     * The host of the actual server
233*04fd306cSNickeau     * (may be virtual)
234*04fd306cSNickeau     * @return string
235*04fd306cSNickeau     */
236*04fd306cSNickeau    public static function getServerHost(): string
237*04fd306cSNickeau    {
238*04fd306cSNickeau        /**
239*04fd306cSNickeau         * Based on {@link getBaseURL()}
240*04fd306cSNickeau         * to be dokuwiki compliant
241*04fd306cSNickeau         */
242*04fd306cSNickeau        $remoteHost = $_SERVER['HTTP_HOST'];
243*04fd306cSNickeau        if ($remoteHost !== null) {
244*04fd306cSNickeau            return $remoteHost;
245*04fd306cSNickeau        }
246*04fd306cSNickeau        $remoteHost = $_SERVER['SERVER_NAME'];
247*04fd306cSNickeau        if ($remoteHost !== null) {
248*04fd306cSNickeau            return $remoteHost;
249*04fd306cSNickeau        }
250*04fd306cSNickeau        /**
251*04fd306cSNickeau         * OS name
252*04fd306cSNickeau         */
253*04fd306cSNickeau        return php_uname('n');
254*04fd306cSNickeau    }
255*04fd306cSNickeau
256*04fd306cSNickeau    public static function getLangDirection()
257*04fd306cSNickeau    {
258*04fd306cSNickeau        global $lang;
259*04fd306cSNickeau        return $lang['direction'];
260*04fd306cSNickeau    }
261*04fd306cSNickeau
262*04fd306cSNickeau    /**
263*04fd306cSNickeau     * Set a site configuration outside a {@link ExecutionContext}
264*04fd306cSNickeau     * It permits to configure the installation before execution
265*04fd306cSNickeau     *
266*04fd306cSNickeau     * For instance, we set the {@link PageTemplateName::CONF_DEFAULT_NAME default page layout} as {@link PageTemplateName::BLANK_TEMPLATE_VALUE}
267*04fd306cSNickeau     * in test by default to speed ud test. In a normal environment, the default is {@link PageTemplateName::HOLY_TEMPLATE_VALUE}
268*04fd306cSNickeau     *
269*04fd306cSNickeau     * @param $key
270*04fd306cSNickeau     * @param $value
271*04fd306cSNickeau     * @param string|null $namespace - the plugin name
272*04fd306cSNickeau     * @return void
273*04fd306cSNickeau     * @deprecated use {@link SiteConfig::setConf()}
274*04fd306cSNickeau     */
275*04fd306cSNickeau    public static function setConf($key, $value, ?string $namespace = PluginUtility::PLUGIN_BASE_NAME)
276*04fd306cSNickeau    {
277*04fd306cSNickeau        global $conf;
278*04fd306cSNickeau        if ($namespace !== null) {
279*04fd306cSNickeau            $conf['plugin'][$namespace][$key] = $value;
280*04fd306cSNickeau        } else {
281*04fd306cSNickeau            $conf[$key] = $value;
282*04fd306cSNickeau        }
283*04fd306cSNickeau    }
284*04fd306cSNickeau
285*04fd306cSNickeau    public static function getLangObject(): Lang
286*04fd306cSNickeau    {
287*04fd306cSNickeau        return Lang::createFromValue(Site::getLang());
288*04fd306cSNickeau    }
289*04fd306cSNickeau
290*04fd306cSNickeau
291*04fd306cSNickeau    public static function getOldDirectory(): LocalPath
292*04fd306cSNickeau    {
293*04fd306cSNickeau        global $conf;
294*04fd306cSNickeau        /**
295*04fd306cSNickeau         * Data dir is the pages dir (savedir is the data dir)
296*04fd306cSNickeau         */
297*04fd306cSNickeau        $oldDirConf = $conf['olddir'];
298*04fd306cSNickeau        if ($oldDirConf === null) {
299*04fd306cSNickeau            throw new ExceptionRuntime("The old directory ($oldDirConf) is null");
300*04fd306cSNickeau        }
301*04fd306cSNickeau        return LocalPath::createFromPathString($oldDirConf);
302*04fd306cSNickeau    }
303*04fd306cSNickeau
304*04fd306cSNickeau
305*04fd306cSNickeau    function getEmailObfuscationConfiguration()
306*04fd306cSNickeau    {
307*04fd306cSNickeau        global $conf;
308*04fd306cSNickeau        return $conf['mailguard'];
309*04fd306cSNickeau    }
31037748cd8SNickeau
31137748cd8SNickeau    /**
31237748cd8SNickeau     * @return string|null
31337748cd8SNickeau     */
3144cadd4f8SNickeau    public static function getLogoUrlAsSvg(): ?string
31537748cd8SNickeau    {
31637748cd8SNickeau
31737748cd8SNickeau
31837748cd8SNickeau        $url = null;
31937748cd8SNickeau        foreach (self::SVG_LOGO_IDS as $svgLogo) {
32037748cd8SNickeau
32137748cd8SNickeau            $svgLogoFN = mediaFN($svgLogo);
32237748cd8SNickeau            if (file_exists($svgLogoFN)) {
32337748cd8SNickeau                $url = ml($svgLogo, '', true, '', true);
32437748cd8SNickeau                break;
3254cadd4f8SNickeau            }
32637748cd8SNickeau        }
32737748cd8SNickeau        return $url;
32837748cd8SNickeau    }
32937748cd8SNickeau
330*04fd306cSNickeau    /**
331*04fd306cSNickeau     * @throws ExceptionNotFound
332*04fd306cSNickeau     */
333*04fd306cSNickeau    public static function getLogoAsSvgImage(): WikiPath
3344cadd4f8SNickeau    {
3354cadd4f8SNickeau        foreach (self::SVG_LOGO_IDS as $svgLogo) {
336*04fd306cSNickeau            $image = WikiPath::createMediaPathFromId($svgLogo);
337*04fd306cSNickeau            if (FileSystems::exists($image)) {
3384cadd4f8SNickeau                return $image;
3394cadd4f8SNickeau            }
3404cadd4f8SNickeau        }
341*04fd306cSNickeau        throw new ExceptionNotFound("No Svg Logo Image found");
3424cadd4f8SNickeau    }
3434cadd4f8SNickeau
344*04fd306cSNickeau    /**
345*04fd306cSNickeau     * @throws ExceptionNotFound
346*04fd306cSNickeau     */
347*04fd306cSNickeau    public static function getLogoAsRasterImage(): FetcherRaster
348*04fd306cSNickeau    {
349*04fd306cSNickeau        foreach (self::PNG_LOGO_IDS as $pngLogo) {
350*04fd306cSNickeau            $pngLogoPath = WikiPath::createMediaPathFromId($pngLogo);
351*04fd306cSNickeau            if (!FileSystems::exists($pngLogoPath)) {
352*04fd306cSNickeau                continue;
353*04fd306cSNickeau            }
354*04fd306cSNickeau            try {
355*04fd306cSNickeau                return FetcherRaster::createImageRasterFetchFromPath($pngLogoPath);
356*04fd306cSNickeau            } catch (ExceptionCompile $e) {
357*04fd306cSNickeau                LogUtility::error("Error while getting the log as raster image: The png logo ($pngLogo) returns an error. {$e->getMessage()}", self::CANONICAL, $e);
358*04fd306cSNickeau                continue;
359*04fd306cSNickeau            }
360*04fd306cSNickeau        }
361*04fd306cSNickeau        throw new ExceptionNotFound("No raster logo image was found");
362*04fd306cSNickeau    }
363*04fd306cSNickeau
364*04fd306cSNickeau
36537748cd8SNickeau    public static function getLogoUrlAsPng()
36637748cd8SNickeau    {
36737748cd8SNickeau
36837748cd8SNickeau        $url = null;
36937748cd8SNickeau        foreach (self::PNG_LOGO_IDS as $svgLogo) {
37037748cd8SNickeau
37137748cd8SNickeau            $svgLogoFN = mediaFN($svgLogo);
37237748cd8SNickeau
37337748cd8SNickeau            if (file_exists($svgLogoFN)) {
37437748cd8SNickeau                $url = ml($svgLogo, '', true, '', true);
37537748cd8SNickeau                break;
37637748cd8SNickeau            };
37737748cd8SNickeau        }
37837748cd8SNickeau        return $url;
37937748cd8SNickeau    }
38037748cd8SNickeau
38137748cd8SNickeau    /**
38237748cd8SNickeau     * @return mixed
3834cadd4f8SNickeau     * @deprecated use {@link Site::getName()} instead
3844cadd4f8SNickeau     * https://www.dokuwiki.org/config:title
38537748cd8SNickeau     */
38637748cd8SNickeau    public static function getTitle()
38737748cd8SNickeau    {
38837748cd8SNickeau        global $conf;
38937748cd8SNickeau        return $conf['title'];
39037748cd8SNickeau    }
39137748cd8SNickeau
39237748cd8SNickeau    /**
3934cadd4f8SNickeau     * https://www.dokuwiki.org/config:title
3944cadd4f8SNickeau     */
3954cadd4f8SNickeau    public static function setName($name)
3964cadd4f8SNickeau    {
3974cadd4f8SNickeau        global $conf;
3984cadd4f8SNickeau        $conf['title'] = $name;
3994cadd4f8SNickeau    }
4004cadd4f8SNickeau
4014cadd4f8SNickeau    /**
40237748cd8SNickeau     * @param string $sep - the separator - generally ("-") but not always
40337748cd8SNickeau     * @return string
40437748cd8SNickeau     *
40537748cd8SNickeau     * Locale always canonicalizes to upper case.
40637748cd8SNickeau     */
407*04fd306cSNickeau    public static function getLocale(string $sep = "-"): string
40837748cd8SNickeau    {
40937748cd8SNickeau
41037748cd8SNickeau        $locale = null;
41137748cd8SNickeau
41237748cd8SNickeau        $lang = self::getLang();
413*04fd306cSNickeau
414c3437056SNickeau        $country = self::getLanguageRegion();
415*04fd306cSNickeau
41637748cd8SNickeau        $locale = strtolower($lang) . $sep . strtoupper($country);
41737748cd8SNickeau
41837748cd8SNickeau        return $locale;
41937748cd8SNickeau    }
42037748cd8SNickeau
42137748cd8SNickeau    /**
42237748cd8SNickeau     *
42337748cd8SNickeau     * ISO 3166 alpha-2 country code
42437748cd8SNickeau     *
42537748cd8SNickeau     */
426*04fd306cSNickeau    public static function getLanguageRegion(): string
42737748cd8SNickeau    {
428*04fd306cSNickeau        $region = SiteConfig::getConfValue(Region::CONF_SITE_LANGUAGE_REGION);
429c3437056SNickeau        if (!empty($region)) {
430c3437056SNickeau            return $region;
43137748cd8SNickeau        } else {
432c3437056SNickeau
433c3437056SNickeau            if (extension_loaded("intl")) {
434c3437056SNickeau                $locale = locale_get_default();
435*04fd306cSNickeau                $localeParts = explode("_", $locale, 2);
436c3437056SNickeau                if (sizeof($localeParts) === 2) {
437c3437056SNickeau                    return $localeParts[1];
438c3437056SNickeau                }
439c3437056SNickeau            }
44037748cd8SNickeau        }
441*04fd306cSNickeau        return "us";
44237748cd8SNickeau
44337748cd8SNickeau    }
44437748cd8SNickeau
44537748cd8SNickeau    /**
446*04fd306cSNickeau     * @return string
44737748cd8SNickeau     * Wrapper around  https://www.dokuwiki.org/config:lang
44837748cd8SNickeau     */
449*04fd306cSNickeau    public static function getLang(): string
45037748cd8SNickeau    {
45137748cd8SNickeau        global $conf;
452c3437056SNickeau        $lang = $conf['lang'];
453*04fd306cSNickeau        if ($lang === null) {
454*04fd306cSNickeau            return "en";
45537748cd8SNickeau        }
456*04fd306cSNickeau        return $lang;
457*04fd306cSNickeau    }
45837748cd8SNickeau
45937748cd8SNickeau    /**
46037748cd8SNickeau     * In a {@link PluginUtility::isDevOrTest()} dev environment,
46137748cd8SNickeau     * don't set the
46237748cd8SNickeau     * https://www.dokuwiki.org/config:baseurl
46337748cd8SNickeau     * to be able to test the metadata / social integration
46437748cd8SNickeau     * via a tunnel
465c3437056SNickeau     *
46637748cd8SNickeau     */
467*04fd306cSNickeau    public static function getBaseUrl(): string
468*04fd306cSNickeau    {
46937748cd8SNickeau
470*04fd306cSNickeau        /**
471*04fd306cSNickeau         * Same as {@link getBaseURL()} ??
472*04fd306cSNickeau         */
473*04fd306cSNickeau        global $conf;
474*04fd306cSNickeau        $baseUrl = $conf['baseurl'];
475*04fd306cSNickeau        if (!empty($baseUrl)) {
476*04fd306cSNickeau            return $baseUrl;
477*04fd306cSNickeau        }
47837748cd8SNickeau        return DOKU_URL;
47937748cd8SNickeau
48037748cd8SNickeau    }
48137748cd8SNickeau
48237748cd8SNickeau    public static function getTag()
48337748cd8SNickeau    {
48437748cd8SNickeau        global $conf;
48537748cd8SNickeau        $tag = $conf['tag'];
48637748cd8SNickeau        return ($tag ? $tag : null);
48737748cd8SNickeau    }
48837748cd8SNickeau
48937748cd8SNickeau    public static function setTemplate($template)
49037748cd8SNickeau    {
49137748cd8SNickeau        global $conf;
49237748cd8SNickeau        $conf['template'] = $template;
49337748cd8SNickeau    }
49437748cd8SNickeau
495*04fd306cSNickeau    /**
496*04fd306cSNickeau     * @return void
497*04fd306cSNickeau     * @deprecated
498*04fd306cSNickeau     */
499c3437056SNickeau    public static function setCacheXhtmlOn()
50037748cd8SNickeau    {
50137748cd8SNickeau        // ensure the value is not -1, which disables caching
50237748cd8SNickeau        // https://www.dokuwiki.org/config:cachetime
50337748cd8SNickeau        global $conf;
50437748cd8SNickeau        $conf['cachetime'] = 60 * 60;
50537748cd8SNickeau    }
50637748cd8SNickeau
50737748cd8SNickeau    public static function debugIsOn()
50837748cd8SNickeau    {
50937748cd8SNickeau        global $conf;
51037748cd8SNickeau        return $conf['allowdebug'];
51137748cd8SNickeau    }
51237748cd8SNickeau
51337748cd8SNickeau    public static function setCacheDefault()
51437748cd8SNickeau    {
51537748cd8SNickeau        // The value is -1, which disables caching
51637748cd8SNickeau        // https://www.dokuwiki.org/config:cachetime
51737748cd8SNickeau        global $conf;
51837748cd8SNickeau        $conf['cachetime'] = -1;
51937748cd8SNickeau    }
52037748cd8SNickeau
52137748cd8SNickeau    public static function useHeadingAsTitle()
52237748cd8SNickeau    {
52337748cd8SNickeau        // https://www.dokuwiki.org/config:useheading
52437748cd8SNickeau        global $conf;
52537748cd8SNickeau        $conf['useheading'] = 1;
52637748cd8SNickeau    }
52737748cd8SNickeau
52837748cd8SNickeau    public static function useHeadingDefault()
52937748cd8SNickeau    {
53037748cd8SNickeau        // https://www.dokuwiki.org/config:useheading
53137748cd8SNickeau        global $conf;
53237748cd8SNickeau        $conf['useheading'] = 0;
53337748cd8SNickeau    }
53437748cd8SNickeau
53537748cd8SNickeau    public static function getTemplate()
53637748cd8SNickeau    {
53737748cd8SNickeau        global $conf;
53837748cd8SNickeau        return $conf['template'];
53937748cd8SNickeau
54037748cd8SNickeau    }
54137748cd8SNickeau
54237748cd8SNickeau    public static function isStrapTemplate()
54337748cd8SNickeau    {
54437748cd8SNickeau        global $conf;
54537748cd8SNickeau        return $conf['template'] == self::STRAP_TEMPLATE_NAME;
54637748cd8SNickeau    }
54737748cd8SNickeau
54837748cd8SNickeau
549*04fd306cSNickeau    public static function getPageDirectory(): LocalPath
55037748cd8SNickeau    {
55137748cd8SNickeau        global $conf;
552c3437056SNickeau        /**
5534cadd4f8SNickeau         * Data dir is the pages dir (savedir is the data dir)
554c3437056SNickeau         */
5554cadd4f8SNickeau        $pageDirectory = $conf['datadir'];
5564cadd4f8SNickeau        if ($pageDirectory === null) {
557*04fd306cSNickeau            throw new ExceptionRuntime("The page directory ($pageDirectory) is null");
5584cadd4f8SNickeau        }
559*04fd306cSNickeau        return LocalPath::createFromPathString($pageDirectory);
56037748cd8SNickeau    }
56137748cd8SNickeau
56237748cd8SNickeau    public static function disableHeadingSectionEditing()
56337748cd8SNickeau    {
564*04fd306cSNickeau        ExecutionContext::getActualOrCreateFromEnv()
565*04fd306cSNickeau            ->getConfig()
566*04fd306cSNickeau            ->setDisableHeadingSectionEditing();
56737748cd8SNickeau    }
56837748cd8SNickeau
56937748cd8SNickeau    public static function setBreadCrumbOn()
57037748cd8SNickeau    {
57137748cd8SNickeau        global $conf;
57237748cd8SNickeau        $conf['youarehere'] = 1;
57337748cd8SNickeau    }
57437748cd8SNickeau
575c3437056SNickeau    public static function isHtmlRenderCacheOn(): bool
576c3437056SNickeau    {
577*04fd306cSNickeau        return ExecutionContext::getActualOrCreateFromEnv()
578*04fd306cSNickeau            ->getConfig()
579*04fd306cSNickeau            ->isXhtmlCacheOn();
580c3437056SNickeau    }
581c3437056SNickeau
582*04fd306cSNickeau    /**
583*04fd306cSNickeau     * @return LocalPath
584*04fd306cSNickeau     * @deprecated
585*04fd306cSNickeau     */
5864cadd4f8SNickeau    public static function getDataDirectory(): LocalPath
587c3437056SNickeau    {
588*04fd306cSNickeau        return ExecutionContext::getActualOrCreateFromEnv()->getConfig()->getDataDirectory();
589c3437056SNickeau    }
590c3437056SNickeau
591c3437056SNickeau    public static function isLowQualityProtectionEnable(): bool
592c3437056SNickeau    {
593*04fd306cSNickeau        return SiteConfig::getConfValue(LowQualityPage::CONF_LOW_QUALITY_PAGE_PROTECTION_ENABLE) === 1;
594c3437056SNickeau    }
595c3437056SNickeau
596*04fd306cSNickeau    /**
597*04fd306cSNickeau     * @return string
598*04fd306cSNickeau     * @deprecated
599*04fd306cSNickeau     */
600*04fd306cSNickeau    public static function getIndexPageName()
601c3437056SNickeau    {
602*04fd306cSNickeau        return ExecutionContext::getActualOrCreateFromEnv()->getConfig()->getIndexPageName();
603c3437056SNickeau    }
604c3437056SNickeau
605c3437056SNickeau    /**
606c3437056SNickeau     * @return mixed - Application / Website name
607c3437056SNickeau     */
608c3437056SNickeau    public static function getName()
609c3437056SNickeau    {
6104cadd4f8SNickeau        return self::getTitle();
611c3437056SNickeau    }
612c3437056SNickeau
613c3437056SNickeau    public static function getTagLine()
614c3437056SNickeau    {
615c3437056SNickeau        global $conf;
616c3437056SNickeau        return $conf['tagline'];
617c3437056SNickeau    }
618c3437056SNickeau
619c3437056SNickeau    /**
620*04fd306cSNickeau     * @return int
621c3437056SNickeau     */
622*04fd306cSNickeau    public static function getXhtmlCacheTime(): int
623c3437056SNickeau    {
624c3437056SNickeau        global $conf;
625c3437056SNickeau        $cacheTime = $conf['cachetime'];
626c3437056SNickeau        if ($cacheTime === null) {
627*04fd306cSNickeau            LogUtility::internalError("The global `cachetime` configuration was not set.", self::CANONICAL);
628*04fd306cSNickeau            return FetcherMarkup::MAX_CACHE_AGE;
629c3437056SNickeau        }
630*04fd306cSNickeau        try {
631*04fd306cSNickeau            return DataType::toInteger($cacheTime);
632*04fd306cSNickeau        } catch (ExceptionBadArgument $e) {
633*04fd306cSNickeau            LogUtility::error("The global `cachetime` configuration has a value ($cacheTime) that is not an integer. Error: {$e->getMessage()}", self::CANONICAL);
634*04fd306cSNickeau            return FetcherMarkup::MAX_CACHE_AGE;
635c3437056SNickeau        }
636c3437056SNickeau    }
637c3437056SNickeau
638c3437056SNickeau    /**
639c3437056SNickeau     * Absolute vs Relative URL
640c3437056SNickeau     * https://www.dokuwiki.org/config:canonical
641c3437056SNickeau     */
6424cadd4f8SNickeau    public static function shouldUrlBeAbsolute(): bool
643c3437056SNickeau    {
644c3437056SNickeau        global $conf;
6454cadd4f8SNickeau        $value = $conf['canonical'];
6464cadd4f8SNickeau        if ($value === 1) {
6474cadd4f8SNickeau            return true;
6484cadd4f8SNickeau        }
6494cadd4f8SNickeau        return false;
6504cadd4f8SNickeau    }
6514cadd4f8SNickeau
6524cadd4f8SNickeau    /**
6534cadd4f8SNickeau     * @param string $description
6544cadd4f8SNickeau     * Same as {@link Site::setDescription()}
6554cadd4f8SNickeau     */
6564cadd4f8SNickeau    public static function setTagLine(string $description)
6574cadd4f8SNickeau    {
6584cadd4f8SNickeau        global $conf;
6594cadd4f8SNickeau        $conf['tagline'] = $description;
6604cadd4f8SNickeau    }
6614cadd4f8SNickeau
6624cadd4f8SNickeau    /**
6634cadd4f8SNickeau     * @param string $description
6644cadd4f8SNickeau     *
6654cadd4f8SNickeau     */
6664cadd4f8SNickeau    public static function setDescription(string $description)
6674cadd4f8SNickeau    {
6684cadd4f8SNickeau        self::setTagLine($description);
6694cadd4f8SNickeau    }
6704cadd4f8SNickeau
671*04fd306cSNickeau    /**
672*04fd306cSNickeau     * @param string $primaryColorValue
673*04fd306cSNickeau     * @return void
674*04fd306cSNickeau     * @deprecated
675*04fd306cSNickeau     */
6764cadd4f8SNickeau    public static function setPrimaryColor(string $primaryColorValue)
6774cadd4f8SNickeau    {
678*04fd306cSNickeau        ExecutionContext::getActualOrCreateFromEnv()
679*04fd306cSNickeau            ->getConfig()
680*04fd306cSNickeau            ->setPrimaryColor($primaryColorValue);
6814cadd4f8SNickeau    }
6824cadd4f8SNickeau
683*04fd306cSNickeau    /**
684*04fd306cSNickeau     * @param $default
685*04fd306cSNickeau     * @return ColorRgb|null
686*04fd306cSNickeau     * @deprecated use {@link SiteConfig::getPrimaryColor()} instead
687*04fd306cSNickeau     */
688*04fd306cSNickeau    public static function getPrimaryColor(string $default = null): ?ColorRgb
6894cadd4f8SNickeau    {
690*04fd306cSNickeau        try {
691*04fd306cSNickeau            return ExecutionContext::getActualOrCreateFromEnv()
692*04fd306cSNickeau                ->getConfig()
693*04fd306cSNickeau                ->getPrimaryColor();
694*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
695*04fd306cSNickeau            if($default===null){
6964cadd4f8SNickeau                return null;
6974cadd4f8SNickeau            }
6984cadd4f8SNickeau            try {
699*04fd306cSNickeau                return ColorRgb::createFromString($default);
700*04fd306cSNickeau            } catch (ExceptionBadArgument $e) {
701*04fd306cSNickeau                LogUtility::internalError("The value ($default) is not a valid color");
7024cadd4f8SNickeau                return null;
7034cadd4f8SNickeau            }
7044cadd4f8SNickeau        }
705*04fd306cSNickeau    }
7064cadd4f8SNickeau
7074cadd4f8SNickeau    public static function getSecondaryColor($default = null): ?ColorRgb
7084cadd4f8SNickeau    {
7094cadd4f8SNickeau        $value = Site::getSecondaryColorValue($default);
7104cadd4f8SNickeau        if ($value === null) {
7114cadd4f8SNickeau            return null;
7124cadd4f8SNickeau        }
7134cadd4f8SNickeau        try {
7144cadd4f8SNickeau            return ColorRgb::createFromString($value);
715*04fd306cSNickeau        } catch (ExceptionCompile $e) {
7164cadd4f8SNickeau            LogUtility::msg("The secondary color value configuration ($value) is not valid. Error: {$e->getMessage()}");
7174cadd4f8SNickeau            return null;
7184cadd4f8SNickeau        }
7194cadd4f8SNickeau    }
7204cadd4f8SNickeau
7214cadd4f8SNickeau    public static function setSecondaryColor(string $secondaryColorValue)
7224cadd4f8SNickeau    {
723*04fd306cSNickeau        self::setConf(ColorRgb::SECONDARY_COLOR_CONF, $secondaryColorValue);
7244cadd4f8SNickeau    }
7254cadd4f8SNickeau
7264cadd4f8SNickeau    public static function unsetPrimaryColor()
7274cadd4f8SNickeau    {
728*04fd306cSNickeau        self::setConf(BrandingColors::PRIMARY_COLOR_CONF, null);
7294cadd4f8SNickeau    }
7304cadd4f8SNickeau
7314cadd4f8SNickeau
732*04fd306cSNickeau    /**
733*04fd306cSNickeau     * @return bool
734*04fd306cSNickeau     * @deprecated
735*04fd306cSNickeau     */
7364cadd4f8SNickeau    public static function isBrandingColorInheritanceEnabled(): bool
7374cadd4f8SNickeau    {
738*04fd306cSNickeau        return ExecutionContext::getActualOrCreateFromEnv()->getConfig()->isBrandingColorInheritanceEnabled();
7394cadd4f8SNickeau    }
7404cadd4f8SNickeau
7414cadd4f8SNickeau
7424cadd4f8SNickeau    /**
743*04fd306cSNickeau     * @param $default
744*04fd306cSNickeau     * @return string|null
7454cadd4f8SNickeau     */
746*04fd306cSNickeau    public static function getPrimaryColorValue($default = null): ?string
7474cadd4f8SNickeau    {
748*04fd306cSNickeau        $value = SiteConfig::getConfValue(BrandingColors::PRIMARY_COLOR_CONF, $default);
7494cadd4f8SNickeau        if ($value !== null && trim($value) !== "") {
7504cadd4f8SNickeau            return $value;
7514cadd4f8SNickeau        }
7524cadd4f8SNickeau        if (PluginUtility::isTest()) {
7534cadd4f8SNickeau            // too much trouble
7544cadd4f8SNickeau            // the load of styles is not consistent
7554cadd4f8SNickeau            return null;
7564cadd4f8SNickeau        }
7574cadd4f8SNickeau        $styles = ColorRgb::getDokuWikiStyles();
7584cadd4f8SNickeau        return $styles["replacements"]["__theme_color__"];
7594cadd4f8SNickeau
7604cadd4f8SNickeau    }
7614cadd4f8SNickeau
7624cadd4f8SNickeau    public static function getSecondaryColorValue($default = null)
7634cadd4f8SNickeau    {
764*04fd306cSNickeau        $value = SiteConfig::getConfValue(ColorRgb::SECONDARY_COLOR_CONF, $default);
7654cadd4f8SNickeau        if ($value === null || trim($value) === "") {
7664cadd4f8SNickeau            return null;
7674cadd4f8SNickeau        }
7684cadd4f8SNickeau        return $value;
7694cadd4f8SNickeau    }
7704cadd4f8SNickeau
7714cadd4f8SNickeau    public static function setCanonicalUrlType(string $value)
7724cadd4f8SNickeau    {
773*04fd306cSNickeau        self::setConf(PageUrlType::CONF_CANONICAL_URL_TYPE, $value);
7744cadd4f8SNickeau    }
7754cadd4f8SNickeau
7764cadd4f8SNickeau    public static function setCanonicalUrlTypeToDefault()
7774cadd4f8SNickeau    {
778*04fd306cSNickeau        self::setConf(PageUrlType::CONF_CANONICAL_URL_TYPE, null);
7794cadd4f8SNickeau    }
7804cadd4f8SNickeau
7814cadd4f8SNickeau    public static function isBrandingColorInheritanceFunctional(): bool
7824cadd4f8SNickeau    {
7834cadd4f8SNickeau        return self::isBrandingColorInheritanceEnabled() && Site::getPrimaryColorValue() !== null;
7844cadd4f8SNickeau    }
7854cadd4f8SNickeau
7864cadd4f8SNickeau    public static function getMediaDirectory(): LocalPath
7874cadd4f8SNickeau    {
7884cadd4f8SNickeau        global $conf;
7894cadd4f8SNickeau        $mediaDirectory = $conf['mediadir'];
7904cadd4f8SNickeau        if ($mediaDirectory === null) {
791*04fd306cSNickeau            throw new ExceptionRuntime("The media directory ($mediaDirectory) is null");
7924cadd4f8SNickeau        }
793*04fd306cSNickeau        return LocalPath::createFromPathString($mediaDirectory);
7944cadd4f8SNickeau    }
7954cadd4f8SNickeau
7964cadd4f8SNickeau    public static function getCacheDirectory(): LocalPath
7974cadd4f8SNickeau    {
7984cadd4f8SNickeau        global $conf;
7994cadd4f8SNickeau        $cacheDirectory = $conf['cachedir'];
8004cadd4f8SNickeau        if ($cacheDirectory === null) {
801*04fd306cSNickeau            throw new ExceptionRuntime("The cache directory ($cacheDirectory) is null");
8024cadd4f8SNickeau        }
803*04fd306cSNickeau        return LocalPath::createFromPathString($cacheDirectory);
8044cadd4f8SNickeau    }
8054cadd4f8SNickeau
8064cadd4f8SNickeau
8074cadd4f8SNickeau    /**
808*04fd306cSNickeau     * @throws ExceptionCompile
8094cadd4f8SNickeau     */
810*04fd306cSNickeau    private static function checkTemplateVersion()
811*04fd306cSNickeau    {
812*04fd306cSNickeau        /**
813*04fd306cSNickeau         * Check the version
814*04fd306cSNickeau         */
815*04fd306cSNickeau        if (self::$STRAP_TEMPLATE_INFO === null) {
816*04fd306cSNickeau            self::$STRAP_TEMPLATE_INFO = confToHash(__DIR__ . '/../../../tpl/strap/template.info.txt');
817*04fd306cSNickeau        }
818*04fd306cSNickeau        $templateVersion = self::$STRAP_TEMPLATE_INFO['version'];
819*04fd306cSNickeau        $comboVersion = PluginUtility::$INFO_PLUGIN['version'];
820*04fd306cSNickeau        /** @noinspection DuplicatedCode */
821*04fd306cSNickeau        if ($templateVersion !== $comboVersion) {
822*04fd306cSNickeau            $strapName = "Strap";
823*04fd306cSNickeau            $comboName = "Combo";
824*04fd306cSNickeau            $strapLink = "<a href=\"https://www.dokuwiki.org/template:strap\">$strapName</a>";
825*04fd306cSNickeau            $comboLink = "<a href=\"https://www.dokuwiki.org/plugin:combo\">$comboName</a>";
826*04fd306cSNickeau            if ($comboVersion > $templateVersion) {
827*04fd306cSNickeau                $upgradeTarget = $strapName;
828*04fd306cSNickeau            } else {
829*04fd306cSNickeau                $upgradeTarget = $comboName;
830*04fd306cSNickeau            }
831*04fd306cSNickeau            $upgradeLink = "<a href=\"" . wl() . "&do=admin&page=extension" . "\">upgrade <b>$upgradeTarget</b> via the extension manager</a>";
832*04fd306cSNickeau            $message = "You should $upgradeLink to the latest version to get a fully functional experience. The version of $comboLink is ($comboVersion) while the version of $strapLink is ($templateVersion).";
833*04fd306cSNickeau            LogUtility::msg($message);
834*04fd306cSNickeau            throw new ExceptionCompile($message);
8354cadd4f8SNickeau        }
8364cadd4f8SNickeau    }
8374cadd4f8SNickeau
838*04fd306cSNickeau    /**
839*04fd306cSNickeau     * @throws ExceptionNotFound
840*04fd306cSNickeau     */
841*04fd306cSNickeau    public static function getLogoImage(): WikiPath
842*04fd306cSNickeau    {
843*04fd306cSNickeau        $logosImages = Site::getLogoImagesAsPath();
844*04fd306cSNickeau        if (empty($logosImages)) {
845*04fd306cSNickeau            throw new ExceptionNotFound("No logo image was installed", "logo");
846*04fd306cSNickeau        }
847*04fd306cSNickeau        return $logosImages[0];
848*04fd306cSNickeau    }
849*04fd306cSNickeau
850*04fd306cSNickeau
851*04fd306cSNickeau    /**
852*04fd306cSNickeau     * @return void
853*04fd306cSNickeau     * @deprecated
854*04fd306cSNickeau     */
855*04fd306cSNickeau    public static function enableSectionEditing()
856*04fd306cSNickeau    {
857*04fd306cSNickeau        ExecutionContext::getActualOrCreateFromEnv()->getConfig()->setEnableSectionEditing();
858*04fd306cSNickeau    }
859*04fd306cSNickeau
860*04fd306cSNickeau    public static function setDefaultTemplate()
861*04fd306cSNickeau    {
862*04fd306cSNickeau        global $conf;
863*04fd306cSNickeau        $conf['template'] = "dokuwiki";
864*04fd306cSNickeau    }
865*04fd306cSNickeau
866*04fd306cSNickeau    /**
867*04fd306cSNickeau     * @return LocalPath[]
868*04fd306cSNickeau     */
869*04fd306cSNickeau    public static function getConfigurationFiles(): array
870*04fd306cSNickeau    {
871*04fd306cSNickeau        $files = [];
872*04fd306cSNickeau        foreach (getConfigFiles('main') as $fileConfig) {
873*04fd306cSNickeau            $files[] = LocalPath::createFromPathString($fileConfig);
874*04fd306cSNickeau        }
875*04fd306cSNickeau        return $files;
876*04fd306cSNickeau    }
877*04fd306cSNickeau
878*04fd306cSNickeau    /**
879*04fd306cSNickeau     * @return string the base directory for all url
880*04fd306cSNickeau     * @throws ExceptionNotFound
881*04fd306cSNickeau     */
882*04fd306cSNickeau    public static function getUrlPathBaseDir(): string
883*04fd306cSNickeau    {
884*04fd306cSNickeau        /**
885*04fd306cSNickeau         * Based on {@link getBaseURL()}
886*04fd306cSNickeau         */
887*04fd306cSNickeau        global $conf;
888*04fd306cSNickeau        if (!empty($conf['basedir'])) {
889*04fd306cSNickeau            return $conf['basedir'];
890*04fd306cSNickeau        }
891*04fd306cSNickeau        $scriptName = LocalPath::createFromPathString($_SERVER['SCRIPT_NAME']);
892*04fd306cSNickeau        if ($scriptName->getExtension() === 'php') {
893*04fd306cSNickeau            return Url::toUrlSeparator($scriptName->getParent()->toAbsoluteId());
894*04fd306cSNickeau        }
895*04fd306cSNickeau        $phpSelf = LocalPath::createFromPathString($_SERVER['PHP_SELF']);
896*04fd306cSNickeau        if ($phpSelf->getExtension() === "php") {
897*04fd306cSNickeau            return Url::toUrlSeparator($scriptName->getParent()->toAbsoluteId());
898*04fd306cSNickeau        }
899*04fd306cSNickeau        if ($_SERVER['DOCUMENT_ROOT'] && $_SERVER['SCRIPT_FILENAME']) {
900*04fd306cSNickeau            $dir = preg_replace('/^' . preg_quote($_SERVER['DOCUMENT_ROOT'], '/') . '/', '',
901*04fd306cSNickeau                $_SERVER['SCRIPT_FILENAME']);
902*04fd306cSNickeau            return Url::toUrlSeparator(dirname('/' . $dir));
903*04fd306cSNickeau        }
904*04fd306cSNickeau        throw new ExceptionNotFound("No Base dir");
905*04fd306cSNickeau
906*04fd306cSNickeau    }
907*04fd306cSNickeau
908*04fd306cSNickeau    public static function getUrlRewrite(): string
909*04fd306cSNickeau    {
910*04fd306cSNickeau        global $conf;
911*04fd306cSNickeau        $confKey = UrlRewrite::CONF_KEY;
912*04fd306cSNickeau        $urlRewrite = $conf[$confKey];
913*04fd306cSNickeau        try {
914*04fd306cSNickeau            $urlRewriteInt = DataType::toInteger($urlRewrite);
915*04fd306cSNickeau        } catch (ExceptionBadArgument $e) {
916*04fd306cSNickeau            LogUtility::internalError("The ($confKey) configuration is not an integer ($urlRewrite)");
917*04fd306cSNickeau            return UrlRewrite::NO_REWRITE;
918*04fd306cSNickeau        }
919*04fd306cSNickeau        switch ($urlRewriteInt) {
920*04fd306cSNickeau            case UrlRewrite::NO_REWRITE_DOKU_VALUE:
921*04fd306cSNickeau                return UrlRewrite::NO_REWRITE;
922*04fd306cSNickeau            case UrlRewrite::WEB_SERVER_REWRITE_DOKU_VALUE:
923*04fd306cSNickeau                return UrlRewrite::WEB_SERVER_REWRITE;
924*04fd306cSNickeau            case UrlRewrite::DOKU_REWRITE_DOKU_VALUE:
925*04fd306cSNickeau                return UrlRewrite::VALUE_DOKU_REWRITE;
926*04fd306cSNickeau            default:
927*04fd306cSNickeau                LogUtility::internalError("The ($confKey) configuration value ($urlRewriteInt) is not a valid value (0, 1 or 2). No rewrite");
928*04fd306cSNickeau                return UrlRewrite::NO_REWRITE;
929*04fd306cSNickeau        }
930*04fd306cSNickeau    }
931*04fd306cSNickeau
932*04fd306cSNickeau    public static function getDefaultMediaLinking(): string
933*04fd306cSNickeau    {
934*04fd306cSNickeau        return SiteConfig::getConfValue(MediaMarkup::CONF_DEFAULT_LINKING, MediaMarkup::LINKING_DIRECT_VALUE);
935*04fd306cSNickeau    }
936*04fd306cSNickeau
937*04fd306cSNickeau    public static function shouldEndpointUrlBeAbsolute(): bool
938*04fd306cSNickeau    {
939*04fd306cSNickeau        global $conf;
940*04fd306cSNickeau        return $conf['canonical'] === 1;
941*04fd306cSNickeau    }
942*04fd306cSNickeau
943*04fd306cSNickeau    public static function setEndpointToAbsoluteUrl()
944*04fd306cSNickeau    {
945*04fd306cSNickeau        global $conf;
946*04fd306cSNickeau        $conf['canonical'] = 1;
947*04fd306cSNickeau    }
948*04fd306cSNickeau
949*04fd306cSNickeau    public static function setEndpointToDefaultUrl()
950*04fd306cSNickeau    {
951*04fd306cSNickeau        global $conf;
952*04fd306cSNickeau        $conf['canonical'] = 0;
953*04fd306cSNickeau    }
954*04fd306cSNickeau
955*04fd306cSNickeau    public function getConfig(): SiteConfig
956*04fd306cSNickeau    {
957*04fd306cSNickeau        if (isset($this->config)) {
958*04fd306cSNickeau            return $this->config;
959*04fd306cSNickeau        }
960*04fd306cSNickeau        $this->config = new SiteConfig($this->executingContext);
961*04fd306cSNickeau        return $this->config;
962c3437056SNickeau    }
963c3437056SNickeau
96437748cd8SNickeau
96537748cd8SNickeau}
966