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*c3437056SNickeauuse RuntimeException; 17*c3437056SNickeau 1837748cd8SNickeauclass Site 1937748cd8SNickeau{ 2037748cd8SNickeau 2137748cd8SNickeau const STRAP_TEMPLATE_NAME = "strap"; 2237748cd8SNickeau 2337748cd8SNickeau const SVG_LOGO_IDS = array( 2437748cd8SNickeau ':wiki:logo.svg', 2537748cd8SNickeau ':logo.svg' 2637748cd8SNickeau ); 2737748cd8SNickeau 2837748cd8SNickeau const PNG_LOGO_IDS = array( 2937748cd8SNickeau ':logo.png', 3037748cd8SNickeau ':wiki:logo.png', 3137748cd8SNickeau ':favicon-32×32.png', 3237748cd8SNickeau ':favicon-16×16.png', 3337748cd8SNickeau ':apple-touch-icon.png', 3437748cd8SNickeau ':android-chrome-192x192.png' 3537748cd8SNickeau ); 3637748cd8SNickeau 3737748cd8SNickeau 3837748cd8SNickeau /** 3937748cd8SNickeau * @return string|null the html img tag or null 4037748cd8SNickeau */ 411fa8c418SNickeau public static function getLogoImgHtmlTag($tagAttributes = null): ?string 4237748cd8SNickeau { 4337748cd8SNickeau $logoIds = self::getLogoIds(); 4437748cd8SNickeau foreach ($logoIds as $logoId) { 451fa8c418SNickeau if ($logoId->exists()) { 46*c3437056SNickeau $mediaLink = MediaLink::createMediaLinkFromPath($logoId->getPath(), $tagAttributes) 47*c3437056SNickeau ->setLazyLoad(false); 4837748cd8SNickeau return $mediaLink->renderMediaTag(); 4937748cd8SNickeau } 5037748cd8SNickeau } 5137748cd8SNickeau return null; 5237748cd8SNickeau } 5337748cd8SNickeau 541fa8c418SNickeau /** 551fa8c418SNickeau * @return Image[] 561fa8c418SNickeau */ 571fa8c418SNickeau private static function getLogoIds(): array 5837748cd8SNickeau { 591fa8c418SNickeau $logosPaths = PluginUtility::mergeAttributes(self::PNG_LOGO_IDS, self::SVG_LOGO_IDS); 601fa8c418SNickeau $logos = []; 611fa8c418SNickeau foreach ($logosPaths as $logoPath) { 62*c3437056SNickeau $dokuPath = DokuPath::createMediaPathFromId($logoPath); 63*c3437056SNickeau $logos[] = Image::createImageFromPath($dokuPath); 641fa8c418SNickeau } 651fa8c418SNickeau return $logos; 6637748cd8SNickeau } 6737748cd8SNickeau 6837748cd8SNickeau 6937748cd8SNickeau /** 7037748cd8SNickeau * @return string|null 7137748cd8SNickeau */ 7237748cd8SNickeau public static function getLogoUrlAsSvg() 7337748cd8SNickeau { 7437748cd8SNickeau 7537748cd8SNickeau 7637748cd8SNickeau $url = null; 7737748cd8SNickeau foreach (self::SVG_LOGO_IDS as $svgLogo) { 7837748cd8SNickeau 7937748cd8SNickeau $svgLogoFN = mediaFN($svgLogo); 8037748cd8SNickeau 8137748cd8SNickeau if (file_exists($svgLogoFN)) { 8237748cd8SNickeau $url = ml($svgLogo, '', true, '', true); 8337748cd8SNickeau break; 8437748cd8SNickeau }; 8537748cd8SNickeau } 8637748cd8SNickeau return $url; 8737748cd8SNickeau } 8837748cd8SNickeau 8937748cd8SNickeau public static function getLogoUrlAsPng() 9037748cd8SNickeau { 9137748cd8SNickeau 9237748cd8SNickeau $url = null; 9337748cd8SNickeau foreach (self::PNG_LOGO_IDS as $svgLogo) { 9437748cd8SNickeau 9537748cd8SNickeau $svgLogoFN = mediaFN($svgLogo); 9637748cd8SNickeau 9737748cd8SNickeau if (file_exists($svgLogoFN)) { 9837748cd8SNickeau $url = ml($svgLogo, '', true, '', true); 9937748cd8SNickeau break; 10037748cd8SNickeau }; 10137748cd8SNickeau } 10237748cd8SNickeau return $url; 10337748cd8SNickeau } 10437748cd8SNickeau 10537748cd8SNickeau /** 10637748cd8SNickeau * https://www.dokuwiki.org/config:title 10737748cd8SNickeau * @return mixed 10837748cd8SNickeau */ 10937748cd8SNickeau public static function getTitle() 11037748cd8SNickeau { 11137748cd8SNickeau global $conf; 11237748cd8SNickeau return $conf['title']; 11337748cd8SNickeau } 11437748cd8SNickeau 11537748cd8SNickeau /** 11637748cd8SNickeau * @param string $sep - the separator - generally ("-") but not always 11737748cd8SNickeau * @return string 11837748cd8SNickeau * 11937748cd8SNickeau * Locale always canonicalizes to upper case. 12037748cd8SNickeau */ 121*c3437056SNickeau public static function getLocale(string $sep = "-"): ?string 12237748cd8SNickeau { 12337748cd8SNickeau 12437748cd8SNickeau $locale = null; 12537748cd8SNickeau 12637748cd8SNickeau $lang = self::getLang(); 12737748cd8SNickeau if ($lang != null) { 128*c3437056SNickeau $country = self::getLanguageRegion(); 12937748cd8SNickeau if ($country != null) { 13037748cd8SNickeau $locale = strtolower($lang) . $sep . strtoupper($country); 13137748cd8SNickeau } 13237748cd8SNickeau } 13337748cd8SNickeau 13437748cd8SNickeau return $locale; 13537748cd8SNickeau } 13637748cd8SNickeau 13737748cd8SNickeau /** 13837748cd8SNickeau * 13937748cd8SNickeau * ISO 3166 alpha-2 country code 14037748cd8SNickeau * 14137748cd8SNickeau */ 142*c3437056SNickeau public static function getLanguageRegion() 14337748cd8SNickeau { 144*c3437056SNickeau $region = PluginUtility::getConfValue(Region::CONF_SITE_LANGUAGE_REGION); 145*c3437056SNickeau if (!empty($region)) { 146*c3437056SNickeau return $region; 14737748cd8SNickeau } else { 148*c3437056SNickeau 149*c3437056SNickeau if (extension_loaded("intl")) { 150*c3437056SNickeau $locale = locale_get_default(); 151*c3437056SNickeau $localeParts = preg_split("/_/", $locale, 2); 152*c3437056SNickeau if (sizeof($localeParts) === 2) { 153*c3437056SNickeau return $localeParts[1]; 154*c3437056SNickeau } 155*c3437056SNickeau } 156*c3437056SNickeau 15737748cd8SNickeau return null; 15837748cd8SNickeau } 15937748cd8SNickeau 16037748cd8SNickeau } 16137748cd8SNickeau 16237748cd8SNickeau /** 16337748cd8SNickeau * @return mixed|null 16437748cd8SNickeau * Wrapper around https://www.dokuwiki.org/config:lang 16537748cd8SNickeau */ 166*c3437056SNickeau public static function getLang() 16737748cd8SNickeau { 16837748cd8SNickeau 16937748cd8SNickeau global $conf; 170*c3437056SNickeau $lang = $conf['lang']; 171*c3437056SNickeau return ($lang ?: null); 17237748cd8SNickeau } 17337748cd8SNickeau 174*c3437056SNickeau public static function getBaseUrl(): string 17537748cd8SNickeau { 17637748cd8SNickeau 17737748cd8SNickeau /** 17837748cd8SNickeau * In a {@link PluginUtility::isDevOrTest()} dev environment, 17937748cd8SNickeau * don't set the 18037748cd8SNickeau * https://www.dokuwiki.org/config:baseurl 18137748cd8SNickeau * to be able to test the metadata / social integration 18237748cd8SNickeau * via a tunnel 183*c3437056SNickeau * 184*c3437056SNickeau * Same as {@link getBaseURL()} ?? 18537748cd8SNickeau */ 18637748cd8SNickeau 18737748cd8SNickeau return DOKU_URL; 18837748cd8SNickeau 18937748cd8SNickeau } 19037748cd8SNickeau 19137748cd8SNickeau public static function getTag() 19237748cd8SNickeau { 19337748cd8SNickeau global $conf; 19437748cd8SNickeau $tag = $conf['tag']; 19537748cd8SNickeau return ($tag ? $tag : null); 19637748cd8SNickeau } 19737748cd8SNickeau 19837748cd8SNickeau /** 19937748cd8SNickeau * @return string - the name of the sidebar page 20037748cd8SNickeau */ 20137748cd8SNickeau public static function getSidebarName() 20237748cd8SNickeau { 20337748cd8SNickeau global $conf; 20437748cd8SNickeau return $conf["sidebar"]; 20537748cd8SNickeau } 20637748cd8SNickeau 20737748cd8SNickeau public static function setTemplate($template) 20837748cd8SNickeau { 20937748cd8SNickeau global $conf; 21037748cd8SNickeau $conf['template'] = $template; 21137748cd8SNickeau } 21237748cd8SNickeau 213*c3437056SNickeau public static function setCacheXhtmlOn() 21437748cd8SNickeau { 21537748cd8SNickeau // ensure the value is not -1, which disables caching 21637748cd8SNickeau // https://www.dokuwiki.org/config:cachetime 21737748cd8SNickeau global $conf; 21837748cd8SNickeau $conf['cachetime'] = 60 * 60; 21937748cd8SNickeau } 22037748cd8SNickeau 22137748cd8SNickeau public static function debugIsOn() 22237748cd8SNickeau { 22337748cd8SNickeau global $conf; 22437748cd8SNickeau return $conf['allowdebug']; 22537748cd8SNickeau } 22637748cd8SNickeau 22737748cd8SNickeau public static function setTemplateToStrap() 22837748cd8SNickeau { 22937748cd8SNickeau global $conf; 23037748cd8SNickeau $conf['template'] = 'strap'; 23137748cd8SNickeau } 23237748cd8SNickeau 23337748cd8SNickeau public static function setTemplateToDefault() 23437748cd8SNickeau { 23537748cd8SNickeau global $conf; 23637748cd8SNickeau $conf['template'] = 'dokuwiki'; 23737748cd8SNickeau } 23837748cd8SNickeau 23937748cd8SNickeau public static function setCacheDefault() 24037748cd8SNickeau { 24137748cd8SNickeau // The value is -1, which disables caching 24237748cd8SNickeau // https://www.dokuwiki.org/config:cachetime 24337748cd8SNickeau global $conf; 24437748cd8SNickeau $conf['cachetime'] = -1; 24537748cd8SNickeau } 24637748cd8SNickeau 24737748cd8SNickeau public static function useHeadingAsTitle() 24837748cd8SNickeau { 24937748cd8SNickeau // https://www.dokuwiki.org/config:useheading 25037748cd8SNickeau global $conf; 25137748cd8SNickeau $conf['useheading'] = 1; 25237748cd8SNickeau } 25337748cd8SNickeau 25437748cd8SNickeau public static function useHeadingDefault() 25537748cd8SNickeau { 25637748cd8SNickeau // https://www.dokuwiki.org/config:useheading 25737748cd8SNickeau global $conf; 25837748cd8SNickeau $conf['useheading'] = 0; 25937748cd8SNickeau } 26037748cd8SNickeau 26137748cd8SNickeau public static function getTemplate() 26237748cd8SNickeau { 26337748cd8SNickeau global $conf; 26437748cd8SNickeau return $conf['template']; 26537748cd8SNickeau 26637748cd8SNickeau } 26737748cd8SNickeau 26837748cd8SNickeau public static function isStrapTemplate() 26937748cd8SNickeau { 27037748cd8SNickeau global $conf; 27137748cd8SNickeau return $conf['template'] == self::STRAP_TEMPLATE_NAME; 27237748cd8SNickeau } 27337748cd8SNickeau 27437748cd8SNickeau public static function getAjaxUrl() 27537748cd8SNickeau { 276*c3437056SNickeau return self::getBaseUrl() . "lib/exe/ajax.php"; 27737748cd8SNickeau } 27837748cd8SNickeau 27937748cd8SNickeau public static function getPageDirectory() 28037748cd8SNickeau { 28137748cd8SNickeau global $conf; 282*c3437056SNickeau /** 283*c3437056SNickeau * Data dir is the pages dir 284*c3437056SNickeau */ 28537748cd8SNickeau return $conf['datadir']; 28637748cd8SNickeau } 28737748cd8SNickeau 28837748cd8SNickeau public static function disableHeadingSectionEditing() 28937748cd8SNickeau { 29037748cd8SNickeau global $conf; 29137748cd8SNickeau $conf['maxseclevel'] = 0; 29237748cd8SNickeau } 29337748cd8SNickeau 29437748cd8SNickeau public static function setBreadCrumbOn() 29537748cd8SNickeau { 29637748cd8SNickeau global $conf; 29737748cd8SNickeau $conf['youarehere'] = 1; 29837748cd8SNickeau } 29937748cd8SNickeau 300*c3437056SNickeau public static function isHtmlRenderCacheOn(): bool 301*c3437056SNickeau { 302*c3437056SNickeau global $conf; 303*c3437056SNickeau return $conf['cachetime'] !== -1; 304*c3437056SNickeau } 305*c3437056SNickeau 306*c3437056SNickeau public static function getDataDirectory() 307*c3437056SNickeau { 308*c3437056SNickeau global $conf; 309*c3437056SNickeau $dataDirectory = $conf['datadir']; 310*c3437056SNickeau if ($dataDirectory === null) { 311*c3437056SNickeau throw new RuntimeException("The base directory ($dataDirectory) is null"); 312*c3437056SNickeau } 313*c3437056SNickeau $file = File::createFromPath($dataDirectory)->getParent(); 314*c3437056SNickeau return $file->getAbsoluteFileSystemPath(); 315*c3437056SNickeau } 316*c3437056SNickeau 317*c3437056SNickeau public static function isLowQualityProtectionEnable(): bool 318*c3437056SNickeau { 319*c3437056SNickeau return PluginUtility::getConfValue(LowQualityPage::CONF_LOW_QUALITY_PAGE_PROTECTION_ENABLE) === 1; 320*c3437056SNickeau } 321*c3437056SNickeau 322*c3437056SNickeau public static function getHomePageName() 323*c3437056SNickeau { 324*c3437056SNickeau global $conf; 325*c3437056SNickeau return $conf["start"]; 326*c3437056SNickeau } 327*c3437056SNickeau 328*c3437056SNickeau /** 329*c3437056SNickeau * @return mixed - Application / Website name 330*c3437056SNickeau */ 331*c3437056SNickeau public static function getName() 332*c3437056SNickeau { 333*c3437056SNickeau global $conf; 334*c3437056SNickeau return $conf["title"]; 335*c3437056SNickeau } 336*c3437056SNickeau 337*c3437056SNickeau public static function getTagLine() 338*c3437056SNickeau { 339*c3437056SNickeau global $conf; 340*c3437056SNickeau return $conf['tagline']; 341*c3437056SNickeau } 342*c3437056SNickeau 343*c3437056SNickeau /** 344*c3437056SNickeau * @return int|null 345*c3437056SNickeau */ 346*c3437056SNickeau public static function getCacheTime(): ?int 347*c3437056SNickeau { 348*c3437056SNickeau global $conf; 349*c3437056SNickeau $cacheTime = $conf['cachetime']; 350*c3437056SNickeau if ($cacheTime === null) { 351*c3437056SNickeau return null; 352*c3437056SNickeau } 353*c3437056SNickeau if (is_numeric($cacheTime)) { 354*c3437056SNickeau return intval($cacheTime); 355*c3437056SNickeau } 356*c3437056SNickeau return null; 357*c3437056SNickeau } 358*c3437056SNickeau 359*c3437056SNickeau /** 360*c3437056SNickeau * Absolute vs Relative URL 361*c3437056SNickeau * https://www.dokuwiki.org/config:canonical 362*c3437056SNickeau */ 363*c3437056SNickeau public static function getCanonicalConfForRelativeVsAbsoluteUrl() 364*c3437056SNickeau { 365*c3437056SNickeau global $conf; 366*c3437056SNickeau return $conf['canonical']; 367*c3437056SNickeau } 368*c3437056SNickeau 36937748cd8SNickeau 37037748cd8SNickeau} 371