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*82a60d03SNickeauuse Exception; 17c3437056SNickeauuse RuntimeException; 18c3437056SNickeau 1937748cd8SNickeauclass Site 2037748cd8SNickeau{ 2137748cd8SNickeau 2237748cd8SNickeau const STRAP_TEMPLATE_NAME = "strap"; 2337748cd8SNickeau 2437748cd8SNickeau const SVG_LOGO_IDS = array( 2537748cd8SNickeau ':wiki:logo.svg', 2637748cd8SNickeau ':logo.svg' 2737748cd8SNickeau ); 2837748cd8SNickeau 2937748cd8SNickeau const PNG_LOGO_IDS = array( 3037748cd8SNickeau ':logo.png', 3137748cd8SNickeau ':wiki:logo.png', 3237748cd8SNickeau ':favicon-32×32.png', 3337748cd8SNickeau ':favicon-16×16.png', 3437748cd8SNickeau ':apple-touch-icon.png', 3537748cd8SNickeau ':android-chrome-192x192.png' 3637748cd8SNickeau ); 3737748cd8SNickeau 3837748cd8SNickeau 3937748cd8SNickeau /** 4037748cd8SNickeau * @return string|null the html img tag or null 4137748cd8SNickeau */ 421fa8c418SNickeau public static function getLogoImgHtmlTag($tagAttributes = null): ?string 4337748cd8SNickeau { 4437748cd8SNickeau $logoIds = self::getLogoIds(); 4537748cd8SNickeau foreach ($logoIds as $logoId) { 461fa8c418SNickeau if ($logoId->exists()) { 47c3437056SNickeau $mediaLink = MediaLink::createMediaLinkFromPath($logoId->getPath(), $tagAttributes) 48c3437056SNickeau ->setLazyLoad(false); 4937748cd8SNickeau return $mediaLink->renderMediaTag(); 5037748cd8SNickeau } 5137748cd8SNickeau } 5237748cd8SNickeau return null; 5337748cd8SNickeau } 5437748cd8SNickeau 551fa8c418SNickeau /** 561fa8c418SNickeau * @return Image[] 571fa8c418SNickeau */ 581fa8c418SNickeau private static function getLogoIds(): array 5937748cd8SNickeau { 601fa8c418SNickeau $logosPaths = PluginUtility::mergeAttributes(self::PNG_LOGO_IDS, self::SVG_LOGO_IDS); 611fa8c418SNickeau $logos = []; 621fa8c418SNickeau foreach ($logosPaths as $logoPath) { 63c3437056SNickeau $dokuPath = DokuPath::createMediaPathFromId($logoPath); 64*82a60d03SNickeau if(FileSystems::exists($dokuPath)) { 65*82a60d03SNickeau try { 66c3437056SNickeau $logos[] = Image::createImageFromPath($dokuPath); 67*82a60d03SNickeau } catch (Exception $e) { 68*82a60d03SNickeau // The image is not valid 69*82a60d03SNickeau LogUtility::msg("The logo ($logoPath) is not a valid image. {$e->getMessage()}"); 70*82a60d03SNickeau } 71*82a60d03SNickeau } 721fa8c418SNickeau } 731fa8c418SNickeau return $logos; 7437748cd8SNickeau } 7537748cd8SNickeau 7637748cd8SNickeau 7737748cd8SNickeau /** 7837748cd8SNickeau * @return string|null 7937748cd8SNickeau */ 8037748cd8SNickeau public static function getLogoUrlAsSvg() 8137748cd8SNickeau { 8237748cd8SNickeau 8337748cd8SNickeau 8437748cd8SNickeau $url = null; 8537748cd8SNickeau foreach (self::SVG_LOGO_IDS as $svgLogo) { 8637748cd8SNickeau 8737748cd8SNickeau $svgLogoFN = mediaFN($svgLogo); 8837748cd8SNickeau 8937748cd8SNickeau if (file_exists($svgLogoFN)) { 9037748cd8SNickeau $url = ml($svgLogo, '', true, '', true); 9137748cd8SNickeau break; 9237748cd8SNickeau }; 9337748cd8SNickeau } 9437748cd8SNickeau return $url; 9537748cd8SNickeau } 9637748cd8SNickeau 9737748cd8SNickeau public static function getLogoUrlAsPng() 9837748cd8SNickeau { 9937748cd8SNickeau 10037748cd8SNickeau $url = null; 10137748cd8SNickeau foreach (self::PNG_LOGO_IDS as $svgLogo) { 10237748cd8SNickeau 10337748cd8SNickeau $svgLogoFN = mediaFN($svgLogo); 10437748cd8SNickeau 10537748cd8SNickeau if (file_exists($svgLogoFN)) { 10637748cd8SNickeau $url = ml($svgLogo, '', true, '', true); 10737748cd8SNickeau break; 10837748cd8SNickeau }; 10937748cd8SNickeau } 11037748cd8SNickeau return $url; 11137748cd8SNickeau } 11237748cd8SNickeau 11337748cd8SNickeau /** 11437748cd8SNickeau * https://www.dokuwiki.org/config:title 11537748cd8SNickeau * @return mixed 11637748cd8SNickeau */ 11737748cd8SNickeau public static function getTitle() 11837748cd8SNickeau { 11937748cd8SNickeau global $conf; 12037748cd8SNickeau return $conf['title']; 12137748cd8SNickeau } 12237748cd8SNickeau 12337748cd8SNickeau /** 12437748cd8SNickeau * @param string $sep - the separator - generally ("-") but not always 12537748cd8SNickeau * @return string 12637748cd8SNickeau * 12737748cd8SNickeau * Locale always canonicalizes to upper case. 12837748cd8SNickeau */ 129c3437056SNickeau public static function getLocale(string $sep = "-"): ?string 13037748cd8SNickeau { 13137748cd8SNickeau 13237748cd8SNickeau $locale = null; 13337748cd8SNickeau 13437748cd8SNickeau $lang = self::getLang(); 13537748cd8SNickeau if ($lang != null) { 136c3437056SNickeau $country = self::getLanguageRegion(); 13737748cd8SNickeau if ($country != null) { 13837748cd8SNickeau $locale = strtolower($lang) . $sep . strtoupper($country); 13937748cd8SNickeau } 14037748cd8SNickeau } 14137748cd8SNickeau 14237748cd8SNickeau return $locale; 14337748cd8SNickeau } 14437748cd8SNickeau 14537748cd8SNickeau /** 14637748cd8SNickeau * 14737748cd8SNickeau * ISO 3166 alpha-2 country code 14837748cd8SNickeau * 14937748cd8SNickeau */ 150c3437056SNickeau public static function getLanguageRegion() 15137748cd8SNickeau { 152c3437056SNickeau $region = PluginUtility::getConfValue(Region::CONF_SITE_LANGUAGE_REGION); 153c3437056SNickeau if (!empty($region)) { 154c3437056SNickeau return $region; 15537748cd8SNickeau } else { 156c3437056SNickeau 157c3437056SNickeau if (extension_loaded("intl")) { 158c3437056SNickeau $locale = locale_get_default(); 159c3437056SNickeau $localeParts = preg_split("/_/", $locale, 2); 160c3437056SNickeau if (sizeof($localeParts) === 2) { 161c3437056SNickeau return $localeParts[1]; 162c3437056SNickeau } 163c3437056SNickeau } 164c3437056SNickeau 16537748cd8SNickeau return null; 16637748cd8SNickeau } 16737748cd8SNickeau 16837748cd8SNickeau } 16937748cd8SNickeau 17037748cd8SNickeau /** 17137748cd8SNickeau * @return mixed|null 17237748cd8SNickeau * Wrapper around https://www.dokuwiki.org/config:lang 17337748cd8SNickeau */ 174c3437056SNickeau public static function getLang() 17537748cd8SNickeau { 17637748cd8SNickeau 17737748cd8SNickeau global $conf; 178c3437056SNickeau $lang = $conf['lang']; 179c3437056SNickeau return ($lang ?: null); 18037748cd8SNickeau } 18137748cd8SNickeau 182c3437056SNickeau public static function getBaseUrl(): string 18337748cd8SNickeau { 18437748cd8SNickeau 18537748cd8SNickeau /** 18637748cd8SNickeau * In a {@link PluginUtility::isDevOrTest()} dev environment, 18737748cd8SNickeau * don't set the 18837748cd8SNickeau * https://www.dokuwiki.org/config:baseurl 18937748cd8SNickeau * to be able to test the metadata / social integration 19037748cd8SNickeau * via a tunnel 191c3437056SNickeau * 192c3437056SNickeau * Same as {@link getBaseURL()} ?? 19337748cd8SNickeau */ 19437748cd8SNickeau 19537748cd8SNickeau return DOKU_URL; 19637748cd8SNickeau 19737748cd8SNickeau } 19837748cd8SNickeau 19937748cd8SNickeau public static function getTag() 20037748cd8SNickeau { 20137748cd8SNickeau global $conf; 20237748cd8SNickeau $tag = $conf['tag']; 20337748cd8SNickeau return ($tag ? $tag : null); 20437748cd8SNickeau } 20537748cd8SNickeau 20637748cd8SNickeau /** 20737748cd8SNickeau * @return string - the name of the sidebar page 20837748cd8SNickeau */ 20937748cd8SNickeau public static function getSidebarName() 21037748cd8SNickeau { 21137748cd8SNickeau global $conf; 21237748cd8SNickeau return $conf["sidebar"]; 21337748cd8SNickeau } 21437748cd8SNickeau 21537748cd8SNickeau public static function setTemplate($template) 21637748cd8SNickeau { 21737748cd8SNickeau global $conf; 21837748cd8SNickeau $conf['template'] = $template; 21937748cd8SNickeau } 22037748cd8SNickeau 221c3437056SNickeau public static function setCacheXhtmlOn() 22237748cd8SNickeau { 22337748cd8SNickeau // ensure the value is not -1, which disables caching 22437748cd8SNickeau // https://www.dokuwiki.org/config:cachetime 22537748cd8SNickeau global $conf; 22637748cd8SNickeau $conf['cachetime'] = 60 * 60; 22737748cd8SNickeau } 22837748cd8SNickeau 22937748cd8SNickeau public static function debugIsOn() 23037748cd8SNickeau { 23137748cd8SNickeau global $conf; 23237748cd8SNickeau return $conf['allowdebug']; 23337748cd8SNickeau } 23437748cd8SNickeau 23537748cd8SNickeau public static function setTemplateToStrap() 23637748cd8SNickeau { 23737748cd8SNickeau global $conf; 23837748cd8SNickeau $conf['template'] = 'strap'; 23937748cd8SNickeau } 24037748cd8SNickeau 24137748cd8SNickeau public static function setTemplateToDefault() 24237748cd8SNickeau { 24337748cd8SNickeau global $conf; 24437748cd8SNickeau $conf['template'] = 'dokuwiki'; 24537748cd8SNickeau } 24637748cd8SNickeau 24737748cd8SNickeau public static function setCacheDefault() 24837748cd8SNickeau { 24937748cd8SNickeau // The value is -1, which disables caching 25037748cd8SNickeau // https://www.dokuwiki.org/config:cachetime 25137748cd8SNickeau global $conf; 25237748cd8SNickeau $conf['cachetime'] = -1; 25337748cd8SNickeau } 25437748cd8SNickeau 25537748cd8SNickeau public static function useHeadingAsTitle() 25637748cd8SNickeau { 25737748cd8SNickeau // https://www.dokuwiki.org/config:useheading 25837748cd8SNickeau global $conf; 25937748cd8SNickeau $conf['useheading'] = 1; 26037748cd8SNickeau } 26137748cd8SNickeau 26237748cd8SNickeau public static function useHeadingDefault() 26337748cd8SNickeau { 26437748cd8SNickeau // https://www.dokuwiki.org/config:useheading 26537748cd8SNickeau global $conf; 26637748cd8SNickeau $conf['useheading'] = 0; 26737748cd8SNickeau } 26837748cd8SNickeau 26937748cd8SNickeau public static function getTemplate() 27037748cd8SNickeau { 27137748cd8SNickeau global $conf; 27237748cd8SNickeau return $conf['template']; 27337748cd8SNickeau 27437748cd8SNickeau } 27537748cd8SNickeau 27637748cd8SNickeau public static function isStrapTemplate() 27737748cd8SNickeau { 27837748cd8SNickeau global $conf; 27937748cd8SNickeau return $conf['template'] == self::STRAP_TEMPLATE_NAME; 28037748cd8SNickeau } 28137748cd8SNickeau 28237748cd8SNickeau public static function getAjaxUrl() 28337748cd8SNickeau { 284c3437056SNickeau return self::getBaseUrl() . "lib/exe/ajax.php"; 28537748cd8SNickeau } 28637748cd8SNickeau 28737748cd8SNickeau public static function getPageDirectory() 28837748cd8SNickeau { 28937748cd8SNickeau global $conf; 290c3437056SNickeau /** 291c3437056SNickeau * Data dir is the pages dir 292c3437056SNickeau */ 29337748cd8SNickeau return $conf['datadir']; 29437748cd8SNickeau } 29537748cd8SNickeau 29637748cd8SNickeau public static function disableHeadingSectionEditing() 29737748cd8SNickeau { 29837748cd8SNickeau global $conf; 29937748cd8SNickeau $conf['maxseclevel'] = 0; 30037748cd8SNickeau } 30137748cd8SNickeau 30237748cd8SNickeau public static function setBreadCrumbOn() 30337748cd8SNickeau { 30437748cd8SNickeau global $conf; 30537748cd8SNickeau $conf['youarehere'] = 1; 30637748cd8SNickeau } 30737748cd8SNickeau 308c3437056SNickeau public static function isHtmlRenderCacheOn(): bool 309c3437056SNickeau { 310c3437056SNickeau global $conf; 311c3437056SNickeau return $conf['cachetime'] !== -1; 312c3437056SNickeau } 313c3437056SNickeau 314c3437056SNickeau public static function getDataDirectory() 315c3437056SNickeau { 316c3437056SNickeau global $conf; 317c3437056SNickeau $dataDirectory = $conf['datadir']; 318c3437056SNickeau if ($dataDirectory === null) { 319c3437056SNickeau throw new RuntimeException("The base directory ($dataDirectory) is null"); 320c3437056SNickeau } 321c3437056SNickeau $file = File::createFromPath($dataDirectory)->getParent(); 322c3437056SNickeau return $file->getAbsoluteFileSystemPath(); 323c3437056SNickeau } 324c3437056SNickeau 325c3437056SNickeau public static function isLowQualityProtectionEnable(): bool 326c3437056SNickeau { 327c3437056SNickeau return PluginUtility::getConfValue(LowQualityPage::CONF_LOW_QUALITY_PAGE_PROTECTION_ENABLE) === 1; 328c3437056SNickeau } 329c3437056SNickeau 330c3437056SNickeau public static function getHomePageName() 331c3437056SNickeau { 332c3437056SNickeau global $conf; 333c3437056SNickeau return $conf["start"]; 334c3437056SNickeau } 335c3437056SNickeau 336c3437056SNickeau /** 337c3437056SNickeau * @return mixed - Application / Website name 338c3437056SNickeau */ 339c3437056SNickeau public static function getName() 340c3437056SNickeau { 341c3437056SNickeau global $conf; 342c3437056SNickeau return $conf["title"]; 343c3437056SNickeau } 344c3437056SNickeau 345c3437056SNickeau public static function getTagLine() 346c3437056SNickeau { 347c3437056SNickeau global $conf; 348c3437056SNickeau return $conf['tagline']; 349c3437056SNickeau } 350c3437056SNickeau 351c3437056SNickeau /** 352c3437056SNickeau * @return int|null 353c3437056SNickeau */ 354c3437056SNickeau public static function getCacheTime(): ?int 355c3437056SNickeau { 356c3437056SNickeau global $conf; 357c3437056SNickeau $cacheTime = $conf['cachetime']; 358c3437056SNickeau if ($cacheTime === null) { 359c3437056SNickeau return null; 360c3437056SNickeau } 361c3437056SNickeau if (is_numeric($cacheTime)) { 362c3437056SNickeau return intval($cacheTime); 363c3437056SNickeau } 364c3437056SNickeau return null; 365c3437056SNickeau } 366c3437056SNickeau 367c3437056SNickeau /** 368c3437056SNickeau * Absolute vs Relative URL 369c3437056SNickeau * https://www.dokuwiki.org/config:canonical 370c3437056SNickeau */ 371c3437056SNickeau public static function getCanonicalConfForRelativeVsAbsoluteUrl() 372c3437056SNickeau { 373c3437056SNickeau global $conf; 374c3437056SNickeau return $conf['canonical']; 375c3437056SNickeau } 376c3437056SNickeau 37737748cd8SNickeau 37837748cd8SNickeau} 379