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 1604fd306cSNickeauuse ComboStrap\Meta\Field\PageTemplateName; 1704fd306cSNickeauuse ComboStrap\Meta\Field\Region; 1804fd306cSNickeauuse ComboStrap\Web\Url; 1904fd306cSNickeauuse ComboStrap\Web\UrlRewrite; 2082a60d03SNickeauuse Exception; 21c3437056SNickeau 2237748cd8SNickeauclass Site 2337748cd8SNickeau{ 2437748cd8SNickeau 2537748cd8SNickeau const STRAP_TEMPLATE_NAME = "strap"; 2637748cd8SNickeau 2737748cd8SNickeau const SVG_LOGO_IDS = array( 2804fd306cSNickeau 'wiki:logo.svg', 2904fd306cSNickeau 'logo.svg' 3037748cd8SNickeau ); 3137748cd8SNickeau 3237748cd8SNickeau const PNG_LOGO_IDS = array( 3304fd306cSNickeau 'logo.png', 3404fd306cSNickeau 'wiki:logo.png', 3504fd306cSNickeau 'favicon-32×32.png', 3604fd306cSNickeau 'favicon-16×16.png', 3704fd306cSNickeau 'apple-touch-icon.png', 3804fd306cSNickeau 'android-chrome-192x192.png' 3937748cd8SNickeau ); 4004fd306cSNickeau /** 4104fd306cSNickeau * Name of the main header slot 4204fd306cSNickeau */ 4304fd306cSNickeau public const SLOT_MAIN_HEADER_NAME = "slot_main_header"; 4404fd306cSNickeau /** 4504fd306cSNickeau * Name of the main footer slot 4604fd306cSNickeau */ 4704fd306cSNickeau public const SLOT_MAIN_FOOTER_NAME = "slot_main_footer"; 4804fd306cSNickeau 4904fd306cSNickeau public const SLOT_MAIN_SIDE_NAME = "slot_main_side"; 5004fd306cSNickeau 5104fd306cSNickeau const CANONICAL = "configuration"; 5204fd306cSNickeau /** 5304fd306cSNickeau * Strap Template meta (version, release date, ...) 5404fd306cSNickeau * @var array 5504fd306cSNickeau */ 5604fd306cSNickeau private static $STRAP_TEMPLATE_INFO; 5704fd306cSNickeau private $executingContext; 5804fd306cSNickeau 5904fd306cSNickeau /** 6004fd306cSNickeau * @param ExecutionContext $executingContext 6104fd306cSNickeau */ 6204fd306cSNickeau public function __construct(ExecutionContext $executingContext) 6304fd306cSNickeau { 6404fd306cSNickeau $this->executingContext = $executingContext; 6504fd306cSNickeau } 6637748cd8SNickeau 6737748cd8SNickeau 6837748cd8SNickeau /** 6904fd306cSNickeau * @return WikiPath[] 701fa8c418SNickeau */ 7104fd306cSNickeau 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) { 7604fd306cSNickeau $dokuPath = WikiPath::createMediaPathFromId($logoPath); 7782a60d03SNickeau if (FileSystems::exists($dokuPath)) { 7882a60d03SNickeau try { 7904fd306cSNickeau $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 8904fd306cSNickeau /** 9004fd306cSNickeau * @deprecated see {@link SiteConfig::setUrlRewriteToDoku()} 9104fd306cSNickeau */ 9204fd306cSNickeau public static function setUrlRewriteToDoku() 9304fd306cSNickeau { 9404fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv()->getConfig() 9504fd306cSNickeau ->setUrlRewriteToDoku(); 9604fd306cSNickeau } 9704fd306cSNickeau 9804fd306cSNickeau /** 9904fd306cSNickeau * Web server rewrite (Apache rewrite (htaccess), Nginx) 10004fd306cSNickeau * @deprecated see {@link SiteConfig::setUrlRewriteToWebServer()} 10104fd306cSNickeau */ 10204fd306cSNickeau public static function setUrlRewriteToWebServer() 10304fd306cSNickeau { 10404fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv()->getConfig() 10504fd306cSNickeau ->setUrlRewriteToWebServer(); 10604fd306cSNickeau } 10704fd306cSNickeau 10804fd306cSNickeau /** 10904fd306cSNickeau * https://www.dokuwiki.org/config:useslash 11004fd306cSNickeau * @return void 11104fd306cSNickeau */ 11204fd306cSNickeau public static function useSlashSeparatorInEndpointUrl() 11304fd306cSNickeau { 11404fd306cSNickeau global $conf; 11504fd306cSNickeau $conf['useslash'] = 1; // use slash instead of ; 11604fd306cSNickeau } 11704fd306cSNickeau 11804fd306cSNickeau 11904fd306cSNickeau public static function getUrlEndpointSeparator(): string 12004fd306cSNickeau { 12104fd306cSNickeau $defaultSeparator = WikiPath::NAMESPACE_SEPARATOR_DOUBLE_POINT; 12204fd306cSNickeau $slashSeparator = "/"; 12304fd306cSNickeau global $conf; 12404fd306cSNickeau $key = 'useslash'; 12504fd306cSNickeau $value = $conf[$key]; 12604fd306cSNickeau try { 12704fd306cSNickeau $valueInt = DataType::toInteger($value); 12804fd306cSNickeau } catch (ExceptionBadArgument $e) { 12904fd306cSNickeau LogUtility::internalError("The ($key) configuration does not have an integer value ($value). Default separator returned"); 13004fd306cSNickeau return $defaultSeparator; 13104fd306cSNickeau } 13204fd306cSNickeau switch ($valueInt) { 13304fd306cSNickeau case 0: 13404fd306cSNickeau return $defaultSeparator; 13504fd306cSNickeau case 1: 13604fd306cSNickeau return $slashSeparator; 13704fd306cSNickeau default: 13804fd306cSNickeau LogUtility::internalError("The ($key) configuration has an integer value ($valueInt) that is not a valid one (0 or 1). Default separator returned"); 13904fd306cSNickeau return $defaultSeparator; 14004fd306cSNickeau } 14104fd306cSNickeau } 14204fd306cSNickeau 14304fd306cSNickeau 14404fd306cSNickeau public static function getTocMinHeadings(): int 14504fd306cSNickeau { 14604fd306cSNickeau global $conf; 14704fd306cSNickeau $confKey = 'tocminheads'; 14804fd306cSNickeau $tocMinHeads = $conf[$confKey]; 14904fd306cSNickeau if ($tocMinHeads === null) { 15004fd306cSNickeau return 0; 15104fd306cSNickeau } 15204fd306cSNickeau try { 15304fd306cSNickeau return DataType::toInteger($tocMinHeads); 15404fd306cSNickeau } catch (ExceptionBadArgument $e) { 15504fd306cSNickeau LogUtility::error("The configuration ($confKey) is not an integer. Error:{$e->getMessage()}", self::CANONICAL); 15604fd306cSNickeau return 0; 15704fd306cSNickeau } 15804fd306cSNickeau } 15904fd306cSNickeau 16004fd306cSNickeau 16104fd306cSNickeau /** 16204fd306cSNickeau * @param int $int 16304fd306cSNickeau * @deprecated 16404fd306cSNickeau */ 16504fd306cSNickeau public static function setTocMinHeading(int $int) 16604fd306cSNickeau { 16704fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 16804fd306cSNickeau ->getConfig() 16904fd306cSNickeau ->setTocMinHeading($int); 17004fd306cSNickeau } 17104fd306cSNickeau 17204fd306cSNickeau public static function getTopTocLevel(): int 17304fd306cSNickeau { 17404fd306cSNickeau global $conf; 17504fd306cSNickeau $confKey = 'toptoclevel'; 17604fd306cSNickeau $value = $conf[$confKey]; 17704fd306cSNickeau try { 17804fd306cSNickeau return DataType::toInteger($value); 17904fd306cSNickeau } catch (ExceptionBadArgument $e) { 18004fd306cSNickeau LogUtility::error("The configuration ($confKey) has a value ($value) that is not an integer", self::CANONICAL); 18104fd306cSNickeau return 1; 18204fd306cSNickeau } 18304fd306cSNickeau } 18404fd306cSNickeau 18504fd306cSNickeau /** 18604fd306cSNickeau * @param int $int 18704fd306cSNickeau * @return void 18804fd306cSNickeau * @deprecated 18904fd306cSNickeau */ 19004fd306cSNickeau public static function setTocTopLevel(int $int) 19104fd306cSNickeau { 19204fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 19304fd306cSNickeau ->getConfig() 19404fd306cSNickeau ->setTocTopLevel($int); 19504fd306cSNickeau 19604fd306cSNickeau } 19704fd306cSNickeau 19804fd306cSNickeau /** 19904fd306cSNickeau * @return int 20004fd306cSNickeau * https://www.dokuwiki.org/config:breadcrumbs 20104fd306cSNickeau */ 20204fd306cSNickeau public static function getVisitedPagesCountInHistoricalBreadCrumb(): int 20304fd306cSNickeau { 20404fd306cSNickeau global $conf; 20504fd306cSNickeau $confKey = 'breadcrumbs'; 20604fd306cSNickeau $visitedPagesInBreadCrumb = $conf[$confKey]; 20704fd306cSNickeau $defaultReturnValue = 10; 20804fd306cSNickeau if ($visitedPagesInBreadCrumb === null) { 20904fd306cSNickeau return $defaultReturnValue; 21004fd306cSNickeau } 21104fd306cSNickeau try { 21204fd306cSNickeau return DataType::toInteger($visitedPagesInBreadCrumb); 21304fd306cSNickeau } catch (ExceptionBadArgument $e) { 21404fd306cSNickeau LogUtility::error("The configuration ($confKey) has value ($visitedPagesInBreadCrumb) that is not an integer. Error:{$e->getMessage()}"); 21504fd306cSNickeau return $defaultReturnValue; 21604fd306cSNickeau } 21704fd306cSNickeau 21804fd306cSNickeau } 21904fd306cSNickeau 22004fd306cSNickeau /** 22104fd306cSNickeau * This setting enables the standard DokuWiki XHTML renderer to be replaced by a render plugin that also provides XHTML output. 22204fd306cSNickeau * @param string $string 22304fd306cSNickeau * @return void 22404fd306cSNickeau */ 22504fd306cSNickeau public static function setXhtmlRenderer(string $string) 22604fd306cSNickeau { 22704fd306cSNickeau global $conf; 22804fd306cSNickeau $conf["renderer_xhtml"] = $string; 22904fd306cSNickeau } 23004fd306cSNickeau 23104fd306cSNickeau /** 23204fd306cSNickeau * The host of the actual server 23304fd306cSNickeau * (may be virtual) 23404fd306cSNickeau * @return string 23504fd306cSNickeau */ 23604fd306cSNickeau public static function getServerHost(): string 23704fd306cSNickeau { 23804fd306cSNickeau /** 23904fd306cSNickeau * Based on {@link getBaseURL()} 24004fd306cSNickeau * to be dokuwiki compliant 24104fd306cSNickeau */ 24204fd306cSNickeau $remoteHost = $_SERVER['HTTP_HOST']; 24304fd306cSNickeau if ($remoteHost !== null) { 24404fd306cSNickeau return $remoteHost; 24504fd306cSNickeau } 24604fd306cSNickeau $remoteHost = $_SERVER['SERVER_NAME']; 24704fd306cSNickeau if ($remoteHost !== null) { 24804fd306cSNickeau return $remoteHost; 24904fd306cSNickeau } 25004fd306cSNickeau /** 25104fd306cSNickeau * OS name 25204fd306cSNickeau */ 25304fd306cSNickeau return php_uname('n'); 25404fd306cSNickeau } 25504fd306cSNickeau 25604fd306cSNickeau public static function getLangDirection() 25704fd306cSNickeau { 25804fd306cSNickeau global $lang; 25904fd306cSNickeau return $lang['direction']; 26004fd306cSNickeau } 26104fd306cSNickeau 26204fd306cSNickeau /** 26304fd306cSNickeau * Set a site configuration outside a {@link ExecutionContext} 26404fd306cSNickeau * It permits to configure the installation before execution 26504fd306cSNickeau * 26604fd306cSNickeau * For instance, we set the {@link PageTemplateName::CONF_DEFAULT_NAME default page layout} as {@link PageTemplateName::BLANK_TEMPLATE_VALUE} 26704fd306cSNickeau * in test by default to speed ud test. In a normal environment, the default is {@link PageTemplateName::HOLY_TEMPLATE_VALUE} 26804fd306cSNickeau * 26904fd306cSNickeau * @param $key 27004fd306cSNickeau * @param $value 27104fd306cSNickeau * @param string|null $namespace - the plugin name 27204fd306cSNickeau * @return void 27304fd306cSNickeau * @deprecated use {@link SiteConfig::setConf()} 27404fd306cSNickeau */ 27504fd306cSNickeau public static function setConf($key, $value, ?string $namespace = PluginUtility::PLUGIN_BASE_NAME) 27604fd306cSNickeau { 27704fd306cSNickeau global $conf; 27804fd306cSNickeau if ($namespace !== null) { 27904fd306cSNickeau $conf['plugin'][$namespace][$key] = $value; 28004fd306cSNickeau } else { 28104fd306cSNickeau $conf[$key] = $value; 28204fd306cSNickeau } 28304fd306cSNickeau } 28404fd306cSNickeau 28504fd306cSNickeau public static function getLangObject(): Lang 28604fd306cSNickeau { 28704fd306cSNickeau return Lang::createFromValue(Site::getLang()); 28804fd306cSNickeau } 28904fd306cSNickeau 29004fd306cSNickeau 29104fd306cSNickeau public static function getOldDirectory(): LocalPath 29204fd306cSNickeau { 29304fd306cSNickeau global $conf; 29404fd306cSNickeau /** 29504fd306cSNickeau * Data dir is the pages dir (savedir is the data dir) 29604fd306cSNickeau */ 29704fd306cSNickeau $oldDirConf = $conf['olddir']; 29804fd306cSNickeau if ($oldDirConf === null) { 29904fd306cSNickeau throw new ExceptionRuntime("The old directory ($oldDirConf) is null"); 30004fd306cSNickeau } 30104fd306cSNickeau return LocalPath::createFromPathString($oldDirConf); 30204fd306cSNickeau } 30304fd306cSNickeau 30404fd306cSNickeau 30504fd306cSNickeau function getEmailObfuscationConfiguration() 30604fd306cSNickeau { 30704fd306cSNickeau global $conf; 30804fd306cSNickeau return $conf['mailguard']; 30904fd306cSNickeau } 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 33004fd306cSNickeau /** 33104fd306cSNickeau * @throws ExceptionNotFound 33204fd306cSNickeau */ 33304fd306cSNickeau public static function getLogoAsSvgImage(): WikiPath 3344cadd4f8SNickeau { 3354cadd4f8SNickeau foreach (self::SVG_LOGO_IDS as $svgLogo) { 33604fd306cSNickeau $image = WikiPath::createMediaPathFromId($svgLogo); 33704fd306cSNickeau if (FileSystems::exists($image)) { 3384cadd4f8SNickeau return $image; 3394cadd4f8SNickeau } 3404cadd4f8SNickeau } 34104fd306cSNickeau throw new ExceptionNotFound("No Svg Logo Image found"); 3424cadd4f8SNickeau } 3434cadd4f8SNickeau 34404fd306cSNickeau /** 34504fd306cSNickeau * @throws ExceptionNotFound 34604fd306cSNickeau */ 34704fd306cSNickeau public static function getLogoAsRasterImage(): FetcherRaster 34804fd306cSNickeau { 34904fd306cSNickeau foreach (self::PNG_LOGO_IDS as $pngLogo) { 35004fd306cSNickeau $pngLogoPath = WikiPath::createMediaPathFromId($pngLogo); 35104fd306cSNickeau if (!FileSystems::exists($pngLogoPath)) { 35204fd306cSNickeau continue; 35304fd306cSNickeau } 35404fd306cSNickeau try { 35504fd306cSNickeau return FetcherRaster::createImageRasterFetchFromPath($pngLogoPath); 35604fd306cSNickeau } catch (ExceptionCompile $e) { 35704fd306cSNickeau LogUtility::error("Error while getting the log as raster image: The png logo ($pngLogo) returns an error. {$e->getMessage()}", self::CANONICAL, $e); 35804fd306cSNickeau continue; 35904fd306cSNickeau } 36004fd306cSNickeau } 36104fd306cSNickeau throw new ExceptionNotFound("No raster logo image was found"); 36204fd306cSNickeau } 36304fd306cSNickeau 36404fd306cSNickeau 365*c30389faSgerardnico public static function getLogoUrlAsPng(): ?string 36637748cd8SNickeau { 36737748cd8SNickeau 36837748cd8SNickeau $url = null; 369*c30389faSgerardnico foreach (self::PNG_LOGO_IDS as $pngId) { 37037748cd8SNickeau 371*c30389faSgerardnico $svgLogoFN = mediaFN($pngId); 37237748cd8SNickeau if (file_exists($svgLogoFN)) { 373*c30389faSgerardnico try { 374*c30389faSgerardnico $url = FetcherRaster::createImageRasterFetchFromId($pngId) 375*c30389faSgerardnico ->getFetchUrl() 376*c30389faSgerardnico ->toAbsoluteUrl() 377*c30389faSgerardnico ->toHtmlString(); 378*c30389faSgerardnico } catch (ExceptionBadArgument|ExceptionBadSyntax|ExceptionNotExists $e) { 379*c30389faSgerardnico LogUtility::internalError("Hardcoded id should not give an error for the png logo url", self::CANONICAL, $e); 380*c30389faSgerardnico continue; 381*c30389faSgerardnico } 38237748cd8SNickeau break; 38337748cd8SNickeau }; 38437748cd8SNickeau } 38537748cd8SNickeau return $url; 38637748cd8SNickeau } 38737748cd8SNickeau 38837748cd8SNickeau /** 38937748cd8SNickeau * @return mixed 3904cadd4f8SNickeau * @deprecated use {@link Site::getName()} instead 3914cadd4f8SNickeau * https://www.dokuwiki.org/config:title 39237748cd8SNickeau */ 39337748cd8SNickeau public static function getTitle() 39437748cd8SNickeau { 39537748cd8SNickeau global $conf; 39637748cd8SNickeau return $conf['title']; 39737748cd8SNickeau } 39837748cd8SNickeau 39937748cd8SNickeau /** 4004cadd4f8SNickeau * https://www.dokuwiki.org/config:title 4014cadd4f8SNickeau */ 4024cadd4f8SNickeau public static function setName($name) 4034cadd4f8SNickeau { 4044cadd4f8SNickeau global $conf; 4054cadd4f8SNickeau $conf['title'] = $name; 4064cadd4f8SNickeau } 4074cadd4f8SNickeau 4084cadd4f8SNickeau /** 40937748cd8SNickeau * @param string $sep - the separator - generally ("-") but not always 41037748cd8SNickeau * @return string 41137748cd8SNickeau * 41237748cd8SNickeau * Locale always canonicalizes to upper case. 41337748cd8SNickeau */ 41404fd306cSNickeau public static function getLocale(string $sep = "-"): string 41537748cd8SNickeau { 41637748cd8SNickeau 41737748cd8SNickeau $locale = null; 41837748cd8SNickeau 41937748cd8SNickeau $lang = self::getLang(); 42004fd306cSNickeau 421c3437056SNickeau $country = self::getLanguageRegion(); 42204fd306cSNickeau 42337748cd8SNickeau $locale = strtolower($lang) . $sep . strtoupper($country); 42437748cd8SNickeau 42537748cd8SNickeau return $locale; 42637748cd8SNickeau } 42737748cd8SNickeau 42837748cd8SNickeau /** 42937748cd8SNickeau * 43037748cd8SNickeau * ISO 3166 alpha-2 country code 43137748cd8SNickeau * 43237748cd8SNickeau */ 43304fd306cSNickeau public static function getLanguageRegion(): string 43437748cd8SNickeau { 43504fd306cSNickeau $region = SiteConfig::getConfValue(Region::CONF_SITE_LANGUAGE_REGION); 436c3437056SNickeau if (!empty($region)) { 437c3437056SNickeau return $region; 43837748cd8SNickeau } else { 439c3437056SNickeau 440c3437056SNickeau if (extension_loaded("intl")) { 441c3437056SNickeau $locale = locale_get_default(); 44204fd306cSNickeau $localeParts = explode("_", $locale, 2); 443c3437056SNickeau if (sizeof($localeParts) === 2) { 444c3437056SNickeau return $localeParts[1]; 445c3437056SNickeau } 446c3437056SNickeau } 44737748cd8SNickeau } 44804fd306cSNickeau return "us"; 44937748cd8SNickeau 45037748cd8SNickeau } 45137748cd8SNickeau 45237748cd8SNickeau /** 45304fd306cSNickeau * @return string 45437748cd8SNickeau * Wrapper around https://www.dokuwiki.org/config:lang 45537748cd8SNickeau */ 45604fd306cSNickeau public static function getLang(): string 45737748cd8SNickeau { 45837748cd8SNickeau global $conf; 459c3437056SNickeau $lang = $conf['lang']; 46004fd306cSNickeau if ($lang === null) { 46104fd306cSNickeau return "en"; 46237748cd8SNickeau } 46304fd306cSNickeau return $lang; 46404fd306cSNickeau } 46537748cd8SNickeau 46637748cd8SNickeau /** 46737748cd8SNickeau * In a {@link PluginUtility::isDevOrTest()} dev environment, 46837748cd8SNickeau * don't set the 46937748cd8SNickeau * https://www.dokuwiki.org/config:baseurl 47037748cd8SNickeau * to be able to test the metadata / social integration 47137748cd8SNickeau * via a tunnel 472c3437056SNickeau * 47337748cd8SNickeau */ 47404fd306cSNickeau public static function getBaseUrl(): string 47504fd306cSNickeau { 47637748cd8SNickeau 47704fd306cSNickeau /** 47804fd306cSNickeau * Same as {@link getBaseURL()} ?? 47904fd306cSNickeau */ 48004fd306cSNickeau global $conf; 48104fd306cSNickeau $baseUrl = $conf['baseurl']; 48204fd306cSNickeau if (!empty($baseUrl)) { 48304fd306cSNickeau return $baseUrl; 48404fd306cSNickeau } 48537748cd8SNickeau return DOKU_URL; 48637748cd8SNickeau 48737748cd8SNickeau } 48837748cd8SNickeau 48937748cd8SNickeau public static function getTag() 49037748cd8SNickeau { 49137748cd8SNickeau global $conf; 49237748cd8SNickeau $tag = $conf['tag']; 49337748cd8SNickeau return ($tag ? $tag : null); 49437748cd8SNickeau } 49537748cd8SNickeau 49637748cd8SNickeau public static function setTemplate($template) 49737748cd8SNickeau { 49837748cd8SNickeau global $conf; 49937748cd8SNickeau $conf['template'] = $template; 50037748cd8SNickeau } 50137748cd8SNickeau 50204fd306cSNickeau /** 50304fd306cSNickeau * @return void 50404fd306cSNickeau * @deprecated 50504fd306cSNickeau */ 506c3437056SNickeau public static function setCacheXhtmlOn() 50737748cd8SNickeau { 50837748cd8SNickeau // ensure the value is not -1, which disables caching 50937748cd8SNickeau // https://www.dokuwiki.org/config:cachetime 51037748cd8SNickeau global $conf; 51137748cd8SNickeau $conf['cachetime'] = 60 * 60; 51237748cd8SNickeau } 51337748cd8SNickeau 51437748cd8SNickeau public static function debugIsOn() 51537748cd8SNickeau { 51637748cd8SNickeau global $conf; 51737748cd8SNickeau return $conf['allowdebug']; 51837748cd8SNickeau } 51937748cd8SNickeau 52037748cd8SNickeau public static function setCacheDefault() 52137748cd8SNickeau { 52237748cd8SNickeau // The value is -1, which disables caching 52337748cd8SNickeau // https://www.dokuwiki.org/config:cachetime 52437748cd8SNickeau global $conf; 52537748cd8SNickeau $conf['cachetime'] = -1; 52637748cd8SNickeau } 52737748cd8SNickeau 52837748cd8SNickeau public static function useHeadingAsTitle() 52937748cd8SNickeau { 53037748cd8SNickeau // https://www.dokuwiki.org/config:useheading 53137748cd8SNickeau global $conf; 53237748cd8SNickeau $conf['useheading'] = 1; 53337748cd8SNickeau } 53437748cd8SNickeau 53537748cd8SNickeau public static function useHeadingDefault() 53637748cd8SNickeau { 53737748cd8SNickeau // https://www.dokuwiki.org/config:useheading 53837748cd8SNickeau global $conf; 53937748cd8SNickeau $conf['useheading'] = 0; 54037748cd8SNickeau } 54137748cd8SNickeau 54237748cd8SNickeau public static function getTemplate() 54337748cd8SNickeau { 54437748cd8SNickeau global $conf; 54537748cd8SNickeau return $conf['template']; 54637748cd8SNickeau 54737748cd8SNickeau } 54837748cd8SNickeau 54937748cd8SNickeau public static function isStrapTemplate() 55037748cd8SNickeau { 55137748cd8SNickeau global $conf; 55237748cd8SNickeau return $conf['template'] == self::STRAP_TEMPLATE_NAME; 55337748cd8SNickeau } 55437748cd8SNickeau 55537748cd8SNickeau 55604fd306cSNickeau public static function getPageDirectory(): LocalPath 55737748cd8SNickeau { 55837748cd8SNickeau global $conf; 559c3437056SNickeau /** 5604cadd4f8SNickeau * Data dir is the pages dir (savedir is the data dir) 561c3437056SNickeau */ 5624cadd4f8SNickeau $pageDirectory = $conf['datadir']; 5634cadd4f8SNickeau if ($pageDirectory === null) { 56404fd306cSNickeau throw new ExceptionRuntime("The page directory ($pageDirectory) is null"); 5654cadd4f8SNickeau } 56604fd306cSNickeau return LocalPath::createFromPathString($pageDirectory); 56737748cd8SNickeau } 56837748cd8SNickeau 56937748cd8SNickeau public static function disableHeadingSectionEditing() 57037748cd8SNickeau { 57104fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 57204fd306cSNickeau ->getConfig() 57304fd306cSNickeau ->setDisableHeadingSectionEditing(); 57437748cd8SNickeau } 57537748cd8SNickeau 57637748cd8SNickeau public static function setBreadCrumbOn() 57737748cd8SNickeau { 57837748cd8SNickeau global $conf; 57937748cd8SNickeau $conf['youarehere'] = 1; 58037748cd8SNickeau } 58137748cd8SNickeau 582c3437056SNickeau public static function isHtmlRenderCacheOn(): bool 583c3437056SNickeau { 58404fd306cSNickeau return ExecutionContext::getActualOrCreateFromEnv() 58504fd306cSNickeau ->getConfig() 58604fd306cSNickeau ->isXhtmlCacheOn(); 587c3437056SNickeau } 588c3437056SNickeau 58904fd306cSNickeau /** 59004fd306cSNickeau * @return LocalPath 59104fd306cSNickeau * @deprecated 59204fd306cSNickeau */ 5934cadd4f8SNickeau public static function getDataDirectory(): LocalPath 594c3437056SNickeau { 59504fd306cSNickeau return ExecutionContext::getActualOrCreateFromEnv()->getConfig()->getDataDirectory(); 596c3437056SNickeau } 597c3437056SNickeau 598c3437056SNickeau public static function isLowQualityProtectionEnable(): bool 599c3437056SNickeau { 60004fd306cSNickeau return SiteConfig::getConfValue(LowQualityPage::CONF_LOW_QUALITY_PAGE_PROTECTION_ENABLE) === 1; 601c3437056SNickeau } 602c3437056SNickeau 60304fd306cSNickeau /** 60404fd306cSNickeau * @return string 60504fd306cSNickeau * @deprecated 60604fd306cSNickeau */ 60704fd306cSNickeau public static function getIndexPageName() 608c3437056SNickeau { 60904fd306cSNickeau return ExecutionContext::getActualOrCreateFromEnv()->getConfig()->getIndexPageName(); 610c3437056SNickeau } 611c3437056SNickeau 612c3437056SNickeau /** 613c3437056SNickeau * @return mixed - Application / Website name 614c3437056SNickeau */ 615c3437056SNickeau public static function getName() 616c3437056SNickeau { 6174cadd4f8SNickeau return self::getTitle(); 618c3437056SNickeau } 619c3437056SNickeau 620c3437056SNickeau public static function getTagLine() 621c3437056SNickeau { 622c3437056SNickeau global $conf; 623c3437056SNickeau return $conf['tagline']; 624c3437056SNickeau } 625c3437056SNickeau 626c3437056SNickeau /** 62704fd306cSNickeau * @return int 628c3437056SNickeau */ 62904fd306cSNickeau public static function getXhtmlCacheTime(): int 630c3437056SNickeau { 631c3437056SNickeau global $conf; 632c3437056SNickeau $cacheTime = $conf['cachetime']; 633c3437056SNickeau if ($cacheTime === null) { 63404fd306cSNickeau LogUtility::internalError("The global `cachetime` configuration was not set.", self::CANONICAL); 63504fd306cSNickeau return FetcherMarkup::MAX_CACHE_AGE; 636c3437056SNickeau } 63704fd306cSNickeau try { 63804fd306cSNickeau return DataType::toInteger($cacheTime); 63904fd306cSNickeau } catch (ExceptionBadArgument $e) { 64004fd306cSNickeau LogUtility::error("The global `cachetime` configuration has a value ($cacheTime) that is not an integer. Error: {$e->getMessage()}", self::CANONICAL); 64104fd306cSNickeau return FetcherMarkup::MAX_CACHE_AGE; 642c3437056SNickeau } 643c3437056SNickeau } 644c3437056SNickeau 645c3437056SNickeau /** 646c3437056SNickeau * Absolute vs Relative URL 647c3437056SNickeau * https://www.dokuwiki.org/config:canonical 648c3437056SNickeau */ 6494cadd4f8SNickeau public static function shouldUrlBeAbsolute(): bool 650c3437056SNickeau { 651c3437056SNickeau global $conf; 6524cadd4f8SNickeau $value = $conf['canonical']; 6534cadd4f8SNickeau if ($value === 1) { 6544cadd4f8SNickeau return true; 6554cadd4f8SNickeau } 6564cadd4f8SNickeau return false; 6574cadd4f8SNickeau } 6584cadd4f8SNickeau 6594cadd4f8SNickeau /** 6604cadd4f8SNickeau * @param string $description 6614cadd4f8SNickeau * Same as {@link Site::setDescription()} 6624cadd4f8SNickeau */ 6634cadd4f8SNickeau public static function setTagLine(string $description) 6644cadd4f8SNickeau { 6654cadd4f8SNickeau global $conf; 6664cadd4f8SNickeau $conf['tagline'] = $description; 6674cadd4f8SNickeau } 6684cadd4f8SNickeau 6694cadd4f8SNickeau /** 6704cadd4f8SNickeau * @param string $description 6714cadd4f8SNickeau * 6724cadd4f8SNickeau */ 6734cadd4f8SNickeau public static function setDescription(string $description) 6744cadd4f8SNickeau { 6754cadd4f8SNickeau self::setTagLine($description); 6764cadd4f8SNickeau } 6774cadd4f8SNickeau 67804fd306cSNickeau /** 67904fd306cSNickeau * @param string $primaryColorValue 68004fd306cSNickeau * @return void 68104fd306cSNickeau * @deprecated 68204fd306cSNickeau */ 6834cadd4f8SNickeau public static function setPrimaryColor(string $primaryColorValue) 6844cadd4f8SNickeau { 68504fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 68604fd306cSNickeau ->getConfig() 68704fd306cSNickeau ->setPrimaryColor($primaryColorValue); 6884cadd4f8SNickeau } 6894cadd4f8SNickeau 69004fd306cSNickeau /** 69104fd306cSNickeau * @param $default 69204fd306cSNickeau * @return ColorRgb|null 69304fd306cSNickeau * @deprecated use {@link SiteConfig::getPrimaryColor()} instead 69404fd306cSNickeau */ 69504fd306cSNickeau public static function getPrimaryColor(string $default = null): ?ColorRgb 6964cadd4f8SNickeau { 69704fd306cSNickeau try { 69804fd306cSNickeau return ExecutionContext::getActualOrCreateFromEnv() 69904fd306cSNickeau ->getConfig() 70004fd306cSNickeau ->getPrimaryColor(); 70104fd306cSNickeau } catch (ExceptionNotFound $e) { 70204fd306cSNickeau if ($default === null) { 7034cadd4f8SNickeau return null; 7044cadd4f8SNickeau } 7054cadd4f8SNickeau try { 70604fd306cSNickeau return ColorRgb::createFromString($default); 70704fd306cSNickeau } catch (ExceptionBadArgument $e) { 70804fd306cSNickeau LogUtility::internalError("The value ($default) is not a valid color"); 7094cadd4f8SNickeau return null; 7104cadd4f8SNickeau } 7114cadd4f8SNickeau } 71204fd306cSNickeau } 7134cadd4f8SNickeau 7144cadd4f8SNickeau public static function getSecondaryColor($default = null): ?ColorRgb 7154cadd4f8SNickeau { 7164cadd4f8SNickeau $value = Site::getSecondaryColorValue($default); 7174cadd4f8SNickeau if ($value === null) { 7184cadd4f8SNickeau return null; 7194cadd4f8SNickeau } 7204cadd4f8SNickeau try { 7214cadd4f8SNickeau return ColorRgb::createFromString($value); 72204fd306cSNickeau } catch (ExceptionCompile $e) { 7234cadd4f8SNickeau LogUtility::msg("The secondary color value configuration ($value) is not valid. Error: {$e->getMessage()}"); 7244cadd4f8SNickeau return null; 7254cadd4f8SNickeau } 7264cadd4f8SNickeau } 7274cadd4f8SNickeau 7284cadd4f8SNickeau public static function setSecondaryColor(string $secondaryColorValue) 7294cadd4f8SNickeau { 73004fd306cSNickeau self::setConf(ColorRgb::SECONDARY_COLOR_CONF, $secondaryColorValue); 7314cadd4f8SNickeau } 7324cadd4f8SNickeau 7334cadd4f8SNickeau public static function unsetPrimaryColor() 7344cadd4f8SNickeau { 73504fd306cSNickeau self::setConf(BrandingColors::PRIMARY_COLOR_CONF, null); 7364cadd4f8SNickeau } 7374cadd4f8SNickeau 7384cadd4f8SNickeau 73904fd306cSNickeau /** 74004fd306cSNickeau * @return bool 74104fd306cSNickeau * @deprecated 74204fd306cSNickeau */ 7434cadd4f8SNickeau public static function isBrandingColorInheritanceEnabled(): bool 7444cadd4f8SNickeau { 74504fd306cSNickeau return ExecutionContext::getActualOrCreateFromEnv()->getConfig()->isBrandingColorInheritanceEnabled(); 7464cadd4f8SNickeau } 7474cadd4f8SNickeau 7484cadd4f8SNickeau 7494cadd4f8SNickeau /** 75004fd306cSNickeau * @param $default 75104fd306cSNickeau * @return string|null 7524cadd4f8SNickeau */ 75304fd306cSNickeau public static function getPrimaryColorValue($default = null): ?string 7544cadd4f8SNickeau { 75504fd306cSNickeau $value = SiteConfig::getConfValue(BrandingColors::PRIMARY_COLOR_CONF, $default); 7564cadd4f8SNickeau if ($value !== null && trim($value) !== "") { 7574cadd4f8SNickeau return $value; 7584cadd4f8SNickeau } 7594cadd4f8SNickeau if (PluginUtility::isTest()) { 7604cadd4f8SNickeau // too much trouble 7614cadd4f8SNickeau // the load of styles is not consistent 7624cadd4f8SNickeau return null; 7634cadd4f8SNickeau } 7644cadd4f8SNickeau $styles = ColorRgb::getDokuWikiStyles(); 7654cadd4f8SNickeau return $styles["replacements"]["__theme_color__"]; 7664cadd4f8SNickeau 7674cadd4f8SNickeau } 7684cadd4f8SNickeau 7694cadd4f8SNickeau public static function getSecondaryColorValue($default = null) 7704cadd4f8SNickeau { 77104fd306cSNickeau $value = SiteConfig::getConfValue(ColorRgb::SECONDARY_COLOR_CONF, $default); 7724cadd4f8SNickeau if ($value === null || trim($value) === "") { 7734cadd4f8SNickeau return null; 7744cadd4f8SNickeau } 7754cadd4f8SNickeau return $value; 7764cadd4f8SNickeau } 7774cadd4f8SNickeau 7784cadd4f8SNickeau public static function setCanonicalUrlType(string $value) 7794cadd4f8SNickeau { 78004fd306cSNickeau self::setConf(PageUrlType::CONF_CANONICAL_URL_TYPE, $value); 7814cadd4f8SNickeau } 7824cadd4f8SNickeau 7834cadd4f8SNickeau public static function setCanonicalUrlTypeToDefault() 7844cadd4f8SNickeau { 78504fd306cSNickeau self::setConf(PageUrlType::CONF_CANONICAL_URL_TYPE, null); 7864cadd4f8SNickeau } 7874cadd4f8SNickeau 7884cadd4f8SNickeau public static function isBrandingColorInheritanceFunctional(): bool 7894cadd4f8SNickeau { 7904cadd4f8SNickeau return self::isBrandingColorInheritanceEnabled() && Site::getPrimaryColorValue() !== null; 7914cadd4f8SNickeau } 7924cadd4f8SNickeau 7934cadd4f8SNickeau public static function getMediaDirectory(): LocalPath 7944cadd4f8SNickeau { 7954cadd4f8SNickeau global $conf; 7964cadd4f8SNickeau $mediaDirectory = $conf['mediadir']; 7974cadd4f8SNickeau if ($mediaDirectory === null) { 79804fd306cSNickeau throw new ExceptionRuntime("The media directory ($mediaDirectory) is null"); 7994cadd4f8SNickeau } 80004fd306cSNickeau return LocalPath::createFromPathString($mediaDirectory); 8014cadd4f8SNickeau } 8024cadd4f8SNickeau 8034cadd4f8SNickeau public static function getCacheDirectory(): LocalPath 8044cadd4f8SNickeau { 8054cadd4f8SNickeau global $conf; 8064cadd4f8SNickeau $cacheDirectory = $conf['cachedir']; 8074cadd4f8SNickeau if ($cacheDirectory === null) { 80804fd306cSNickeau throw new ExceptionRuntime("The cache directory ($cacheDirectory) is null"); 8094cadd4f8SNickeau } 81004fd306cSNickeau return LocalPath::createFromPathString($cacheDirectory); 8114cadd4f8SNickeau } 8124cadd4f8SNickeau 8134cadd4f8SNickeau 8144cadd4f8SNickeau /** 81504fd306cSNickeau * @throws ExceptionCompile 8164cadd4f8SNickeau */ 81704fd306cSNickeau private static function checkTemplateVersion() 81804fd306cSNickeau { 81904fd306cSNickeau /** 82004fd306cSNickeau * Check the version 82104fd306cSNickeau */ 82204fd306cSNickeau if (self::$STRAP_TEMPLATE_INFO === null) { 82304fd306cSNickeau self::$STRAP_TEMPLATE_INFO = confToHash(__DIR__ . '/../../../tpl/strap/template.info.txt'); 82404fd306cSNickeau } 82504fd306cSNickeau $templateVersion = self::$STRAP_TEMPLATE_INFO['version']; 82604fd306cSNickeau $comboVersion = PluginUtility::$INFO_PLUGIN['version']; 82704fd306cSNickeau /** @noinspection DuplicatedCode */ 82804fd306cSNickeau if ($templateVersion !== $comboVersion) { 82904fd306cSNickeau $strapName = "Strap"; 83004fd306cSNickeau $comboName = "Combo"; 83104fd306cSNickeau $strapLink = "<a href=\"https://www.dokuwiki.org/template:strap\">$strapName</a>"; 83204fd306cSNickeau $comboLink = "<a href=\"https://www.dokuwiki.org/plugin:combo\">$comboName</a>"; 83304fd306cSNickeau if ($comboVersion > $templateVersion) { 83404fd306cSNickeau $upgradeTarget = $strapName; 83504fd306cSNickeau } else { 83604fd306cSNickeau $upgradeTarget = $comboName; 83704fd306cSNickeau } 83804fd306cSNickeau $upgradeLink = "<a href=\"" . wl() . "&do=admin&page=extension" . "\">upgrade <b>$upgradeTarget</b> via the extension manager</a>"; 83904fd306cSNickeau $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)."; 84004fd306cSNickeau LogUtility::msg($message); 84104fd306cSNickeau throw new ExceptionCompile($message); 8424cadd4f8SNickeau } 8434cadd4f8SNickeau } 8444cadd4f8SNickeau 84504fd306cSNickeau /** 84604fd306cSNickeau * @throws ExceptionNotFound 84704fd306cSNickeau */ 84804fd306cSNickeau public static function getLogoImage(): WikiPath 84904fd306cSNickeau { 85004fd306cSNickeau $logosImages = Site::getLogoImagesAsPath(); 85104fd306cSNickeau if (empty($logosImages)) { 85204fd306cSNickeau throw new ExceptionNotFound("No logo image was installed", "logo"); 85304fd306cSNickeau } 85404fd306cSNickeau return $logosImages[0]; 85504fd306cSNickeau } 85604fd306cSNickeau 85704fd306cSNickeau 85804fd306cSNickeau /** 85904fd306cSNickeau * @return void 86004fd306cSNickeau * @deprecated 86104fd306cSNickeau */ 86204fd306cSNickeau public static function enableSectionEditing() 86304fd306cSNickeau { 86404fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv()->getConfig()->setEnableSectionEditing(); 86504fd306cSNickeau } 86604fd306cSNickeau 86704fd306cSNickeau public static function setDefaultTemplate() 86804fd306cSNickeau { 86904fd306cSNickeau global $conf; 87004fd306cSNickeau $conf['template'] = "dokuwiki"; 87104fd306cSNickeau } 87204fd306cSNickeau 87304fd306cSNickeau /** 87404fd306cSNickeau * @return LocalPath[] 87504fd306cSNickeau */ 87604fd306cSNickeau public static function getConfigurationFiles(): array 87704fd306cSNickeau { 87804fd306cSNickeau $files = []; 87904fd306cSNickeau foreach (getConfigFiles('main') as $fileConfig) { 88004fd306cSNickeau $files[] = LocalPath::createFromPathString($fileConfig); 88104fd306cSNickeau } 88204fd306cSNickeau return $files; 88304fd306cSNickeau } 88404fd306cSNickeau 88504fd306cSNickeau /** 88604fd306cSNickeau * @return string the base directory for all url 88704fd306cSNickeau * @throws ExceptionNotFound 88804fd306cSNickeau */ 88904fd306cSNickeau public static function getUrlPathBaseDir(): string 89004fd306cSNickeau { 89104fd306cSNickeau /** 89204fd306cSNickeau * Based on {@link getBaseURL()} 89304fd306cSNickeau */ 89404fd306cSNickeau global $conf; 89504fd306cSNickeau if (!empty($conf['basedir'])) { 89604fd306cSNickeau return $conf['basedir']; 89704fd306cSNickeau } 89804fd306cSNickeau $scriptName = LocalPath::createFromPathString($_SERVER['SCRIPT_NAME']); 89904fd306cSNickeau if ($scriptName->getExtension() === 'php') { 90004fd306cSNickeau return Url::toUrlSeparator($scriptName->getParent()->toAbsoluteId()); 90104fd306cSNickeau } 90204fd306cSNickeau $phpSelf = LocalPath::createFromPathString($_SERVER['PHP_SELF']); 90304fd306cSNickeau if ($phpSelf->getExtension() === "php") { 90404fd306cSNickeau return Url::toUrlSeparator($scriptName->getParent()->toAbsoluteId()); 90504fd306cSNickeau } 90604fd306cSNickeau if ($_SERVER['DOCUMENT_ROOT'] && $_SERVER['SCRIPT_FILENAME']) { 90704fd306cSNickeau $dir = preg_replace('/^' . preg_quote($_SERVER['DOCUMENT_ROOT'], '/') . '/', '', 90804fd306cSNickeau $_SERVER['SCRIPT_FILENAME']); 90904fd306cSNickeau return Url::toUrlSeparator(dirname('/' . $dir)); 91004fd306cSNickeau } 91104fd306cSNickeau throw new ExceptionNotFound("No Base dir"); 91204fd306cSNickeau 91304fd306cSNickeau } 91404fd306cSNickeau 91504fd306cSNickeau public static function getUrlRewrite(): string 91604fd306cSNickeau { 91704fd306cSNickeau global $conf; 91804fd306cSNickeau $confKey = UrlRewrite::CONF_KEY; 91904fd306cSNickeau $urlRewrite = $conf[$confKey]; 92004fd306cSNickeau try { 92104fd306cSNickeau $urlRewriteInt = DataType::toInteger($urlRewrite); 92204fd306cSNickeau } catch (ExceptionBadArgument $e) { 92304fd306cSNickeau LogUtility::internalError("The ($confKey) configuration is not an integer ($urlRewrite)"); 92404fd306cSNickeau return UrlRewrite::NO_REWRITE; 92504fd306cSNickeau } 92604fd306cSNickeau switch ($urlRewriteInt) { 92704fd306cSNickeau case UrlRewrite::NO_REWRITE_DOKU_VALUE: 92804fd306cSNickeau return UrlRewrite::NO_REWRITE; 92904fd306cSNickeau case UrlRewrite::WEB_SERVER_REWRITE_DOKU_VALUE: 93004fd306cSNickeau return UrlRewrite::WEB_SERVER_REWRITE; 93104fd306cSNickeau case UrlRewrite::DOKU_REWRITE_DOKU_VALUE: 93204fd306cSNickeau return UrlRewrite::VALUE_DOKU_REWRITE; 93304fd306cSNickeau default: 93404fd306cSNickeau LogUtility::internalError("The ($confKey) configuration value ($urlRewriteInt) is not a valid value (0, 1 or 2). No rewrite"); 93504fd306cSNickeau return UrlRewrite::NO_REWRITE; 93604fd306cSNickeau } 93704fd306cSNickeau } 93804fd306cSNickeau 93904fd306cSNickeau public static function getDefaultMediaLinking(): string 94004fd306cSNickeau { 94104fd306cSNickeau return SiteConfig::getConfValue(MediaMarkup::CONF_DEFAULT_LINKING, MediaMarkup::LINKING_DIRECT_VALUE); 94204fd306cSNickeau } 94304fd306cSNickeau 94404fd306cSNickeau public static function shouldEndpointUrlBeAbsolute(): bool 94504fd306cSNickeau { 94604fd306cSNickeau global $conf; 94704fd306cSNickeau return $conf['canonical'] === 1; 94804fd306cSNickeau } 94904fd306cSNickeau 95004fd306cSNickeau public static function setEndpointToAbsoluteUrl() 95104fd306cSNickeau { 95204fd306cSNickeau global $conf; 95304fd306cSNickeau $conf['canonical'] = 1; 95404fd306cSNickeau } 95504fd306cSNickeau 95604fd306cSNickeau public static function setEndpointToDefaultUrl() 95704fd306cSNickeau { 95804fd306cSNickeau global $conf; 95904fd306cSNickeau $conf['canonical'] = 0; 96004fd306cSNickeau } 96104fd306cSNickeau 96204fd306cSNickeau public function getConfig(): SiteConfig 96304fd306cSNickeau { 96404fd306cSNickeau if (isset($this->config)) { 96504fd306cSNickeau return $this->config; 96604fd306cSNickeau } 96704fd306cSNickeau $this->config = new SiteConfig($this->executingContext); 96804fd306cSNickeau return $this->config; 969c3437056SNickeau } 970c3437056SNickeau 97137748cd8SNickeau 97237748cd8SNickeau} 973