14cadd4f8SNickeau<?php 24cadd4f8SNickeau 34cadd4f8SNickeau 44cadd4f8SNickeaunamespace ComboStrap; 54cadd4f8SNickeau 64cadd4f8SNickeau 74cadd4f8SNickeauclass Brand 84cadd4f8SNickeau{ 94cadd4f8SNickeau 104cadd4f8SNickeau const NEWSLETTER_BRAND_NAME = "newsletter"; 114cadd4f8SNickeau const EMAIL_BRAND_NAME = "email"; 124cadd4f8SNickeau 1304fd306cSNickeau 144cadd4f8SNickeau /** 154cadd4f8SNickeau * The brand of the current application/website 164cadd4f8SNickeau */ 174cadd4f8SNickeau public const CURRENT_BRAND = "current"; 1804fd306cSNickeau const CANONICAL = "brand"; 1904fd306cSNickeau const ABBR_PROPERTY = 'abbr'; 2004fd306cSNickeau /** 2104fd306cSNickeau * @var array an array of brand abbreviation as key and their name as value 2204fd306cSNickeau */ 2304fd306cSNickeau private static array $BRAND_ABBR; 244cadd4f8SNickeau 254cadd4f8SNickeau 264cadd4f8SNickeau private $secondaryColor; 274cadd4f8SNickeau private $brandUrl; 284cadd4f8SNickeau 294cadd4f8SNickeau /** 304cadd4f8SNickeau * @var array 314cadd4f8SNickeau */ 3204fd306cSNickeau public static array $brandDictionary; 334cadd4f8SNickeau /** 344cadd4f8SNickeau * @var bool 354cadd4f8SNickeau */ 3604fd306cSNickeau private bool $unknown = false; 374cadd4f8SNickeau /** 384cadd4f8SNickeau * @var mixed 394cadd4f8SNickeau */ 404cadd4f8SNickeau private $brandDict; 414cadd4f8SNickeau 4204fd306cSNickeau 434cadd4f8SNickeau /** 444cadd4f8SNickeau * Brand constructor. 454cadd4f8SNickeau * @param string $name 464cadd4f8SNickeau */ 4704fd306cSNickeau private function __construct(string $name) 484cadd4f8SNickeau { 4904fd306cSNickeau 5004fd306cSNickeau $this->name = $name; 514cadd4f8SNickeau 524cadd4f8SNickeau /** 534cadd4f8SNickeau * Get the brands 544cadd4f8SNickeau */ 5504fd306cSNickeau $brandDictionary = Brand::getBrandDictionary(); 564cadd4f8SNickeau 574cadd4f8SNickeau 584cadd4f8SNickeau /** 594cadd4f8SNickeau * Build the data for the brand 604cadd4f8SNickeau */ 61*70bbd7f1Sgerardnico $this->brandDict = $brandDictionary[$this->name] ?? null; 624cadd4f8SNickeau switch ($this->name) { 634cadd4f8SNickeau case self::CURRENT_BRAND: 644cadd4f8SNickeau $this->brandUrl = Site::getBaseUrl(); 654cadd4f8SNickeau $secondaryColor = Site::getSecondaryColor(); 664cadd4f8SNickeau if ($secondaryColor !== null) { 674cadd4f8SNickeau // the predicates on the secondary value is to avoid a loop with the the function below 684cadd4f8SNickeau $this->secondaryColor = $secondaryColor->toCssValue(); 694cadd4f8SNickeau } 704cadd4f8SNickeau break; 714cadd4f8SNickeau default: 724cadd4f8SNickeau if ($this->brandDict !== null) { 73*70bbd7f1Sgerardnico $colors = $this->brandDict["colors"] ?? null; 74*70bbd7f1Sgerardnico if ($colors !== null) { 75*70bbd7f1Sgerardnico $this->secondaryColor = $colors["secondary"]; 76*70bbd7f1Sgerardnico } else { 77*70bbd7f1Sgerardnico $this->secondaryColor = null; 78*70bbd7f1Sgerardnico } 79*70bbd7f1Sgerardnico $this->brandUrl = $this->brandDict["url"] ?? null; 804cadd4f8SNickeau return; 814cadd4f8SNickeau } 824cadd4f8SNickeau $this->unknown = true; 834cadd4f8SNickeau break; 844cadd4f8SNickeau } 854cadd4f8SNickeau 864cadd4f8SNickeau } 874cadd4f8SNickeau 884cadd4f8SNickeau /** 894cadd4f8SNickeau * @return string[] 904cadd4f8SNickeau */ 914cadd4f8SNickeau public static function getAllKnownBrandNames(): array 924cadd4f8SNickeau { 934cadd4f8SNickeau 9404fd306cSNickeau $brands = self::getAllBrands(); 9504fd306cSNickeau $brandNames = [self::CURRENT_BRAND]; 9604fd306cSNickeau foreach ($brands as $brand) { 9704fd306cSNickeau $brandNames[] = $brand->getName(); 9804fd306cSNickeau try { 9904fd306cSNickeau $brandNames[] = $brand->getAbbr(); 10004fd306cSNickeau } catch (ExceptionNotFound $e) { 10104fd306cSNickeau // ok 10204fd306cSNickeau } 10304fd306cSNickeau } 10404fd306cSNickeau return $brandNames; 10504fd306cSNickeau 1064cadd4f8SNickeau } 1074cadd4f8SNickeau 10804fd306cSNickeau 1094cadd4f8SNickeau /** 11004fd306cSNickeau * @return Brand[] 1114cadd4f8SNickeau */ 11204fd306cSNickeau public static function getAllBrands(): array 1134cadd4f8SNickeau { 1144cadd4f8SNickeau $brandDictionary = self::getBrandDictionary(); 11504fd306cSNickeau $brands = []; 11604fd306cSNickeau foreach (array_keys($brandDictionary) as $brandName) { 11704fd306cSNickeau $brands[] = self::create($brandName); 11804fd306cSNickeau } 11904fd306cSNickeau return $brands; 1204cadd4f8SNickeau } 1214cadd4f8SNickeau 1224cadd4f8SNickeau /** 12304fd306cSNickeau * @param $type - the button type (ie one of {@link BrandButton::TYPE_BUTTONS} 12404fd306cSNickeau * @return array - the brand names that can be used as type in the brand button 12504fd306cSNickeau */ 12604fd306cSNickeau public static function getBrandNamesForButtonType($type): array 12704fd306cSNickeau { 12804fd306cSNickeau $brands = self::getAllBrands(); 12904fd306cSNickeau $brandNamesForType = []; 13004fd306cSNickeau foreach ($brands as $brand) { 13104fd306cSNickeau if ($brand->supportButtonType($type)) { 13204fd306cSNickeau $brandNamesForType[] = $brand->getName(); 13304fd306cSNickeau try { 13404fd306cSNickeau $brandNamesForType[] = $brand->getAbbr(); 13504fd306cSNickeau } catch (ExceptionNotFound $e) { 13604fd306cSNickeau // ok 13704fd306cSNickeau } 13804fd306cSNickeau } 13904fd306cSNickeau } 14004fd306cSNickeau return $brandNamesForType; 14104fd306cSNickeau } 14204fd306cSNickeau 14304fd306cSNickeau /** 14404fd306cSNickeau * 1454cadd4f8SNickeau */ 1464cadd4f8SNickeau public static function getBrandDictionary(): array 1474cadd4f8SNickeau { 14804fd306cSNickeau if (!isset(Brand::$brandDictionary)) { 14904fd306cSNickeau try { 1504cadd4f8SNickeau Brand::$brandDictionary = Dictionary::getFrom("brands"); 15104fd306cSNickeau } catch (ExceptionCompile $e) { 15204fd306cSNickeau // Should never happens 15304fd306cSNickeau Brand::$brandDictionary = []; 15404fd306cSNickeau LogUtility::error("We can't load the brands dictionary. Error: " . $e->getMessage(), self::CANONICAL, $e); 15504fd306cSNickeau } 1564cadd4f8SNickeau } 1574cadd4f8SNickeau return Brand::$brandDictionary; 1584cadd4f8SNickeau } 1594cadd4f8SNickeau 1604cadd4f8SNickeau 1614cadd4f8SNickeau /** 1624cadd4f8SNickeau * @var string 1634cadd4f8SNickeau * The name of the brand, 1644cadd4f8SNickeau * for company, we follow the naming of 1654cadd4f8SNickeau * https://github.com/ellisonleao/sharer.js 1664cadd4f8SNickeau */ 1674cadd4f8SNickeau private $name; 1684cadd4f8SNickeau 16904fd306cSNickeau 1704cadd4f8SNickeau public static function create(string $brandName): Brand 1714cadd4f8SNickeau { 17204fd306cSNickeau 17304fd306cSNickeau $brandNameQualified = strtolower($brandName); 17404fd306cSNickeau $brandNameQualified = Brand::getBrandNameFromAbbr($brandNameQualified); 17504fd306cSNickeau $objectIdentifier = self::CANONICAL . "-" . $brandNameQualified; 17604fd306cSNickeau $executionContext = ExecutionContext::getActualOrCreateFromEnv(); 17704fd306cSNickeau try { 17804fd306cSNickeau return $executionContext->getRuntimeObject($objectIdentifier); 17904fd306cSNickeau } catch (ExceptionNotFound $e) { 18004fd306cSNickeau $brandObject = new Brand($brandNameQualified); 18104fd306cSNickeau $executionContext->setRuntimeObject($objectIdentifier, $brandObject); 18204fd306cSNickeau return $brandObject; 1834cadd4f8SNickeau } 1844cadd4f8SNickeau 18504fd306cSNickeau } 18604fd306cSNickeau 18704fd306cSNickeau private static function getBrandNameFromAbbr(string $name) 18804fd306cSNickeau { 18904fd306cSNickeau if (!isset(self::$BRAND_ABBR)) { 19004fd306cSNickeau $brandDictionary = self::getBrandDictionary(); 19104fd306cSNickeau foreach ($brandDictionary as $brandName => $brandProperties) { 192*70bbd7f1Sgerardnico $abbr = $brandProperties[self::ABBR_PROPERTY] ?? null; 19304fd306cSNickeau if (empty($abbr)) { 19404fd306cSNickeau continue; 19504fd306cSNickeau } 19604fd306cSNickeau self::$BRAND_ABBR[$abbr] = $brandName; 19704fd306cSNickeau } 19804fd306cSNickeau } 19904fd306cSNickeau if (isset(self::$BRAND_ABBR[$name])) { 20004fd306cSNickeau return self::$BRAND_ABBR[$name]; 20104fd306cSNickeau } 20204fd306cSNickeau return $name; 20304fd306cSNickeau 20404fd306cSNickeau } 20504fd306cSNickeau 20604fd306cSNickeau 2074cadd4f8SNickeau /** 2084cadd4f8SNickeau * If the brand name is unknown (ie custom) 2094cadd4f8SNickeau * @return bool 2104cadd4f8SNickeau */ 2114cadd4f8SNickeau public function isUnknown(): bool 2124cadd4f8SNickeau { 2134cadd4f8SNickeau return $this->unknown; 2144cadd4f8SNickeau 2154cadd4f8SNickeau } 2164cadd4f8SNickeau 2174cadd4f8SNickeau public function getName(): string 2184cadd4f8SNickeau { 2194cadd4f8SNickeau return $this->name; 2204cadd4f8SNickeau } 2214cadd4f8SNickeau 2224cadd4f8SNickeau public function __toString() 2234cadd4f8SNickeau { 2244cadd4f8SNickeau if ($this->name === Brand::CURRENT_BRAND) { 2254cadd4f8SNickeau return $this->name . " (" . Site::getTitle() . ")"; 2264cadd4f8SNickeau } 2274cadd4f8SNickeau return $this->name; 2284cadd4f8SNickeau } 2294cadd4f8SNickeau 2304cadd4f8SNickeau /** 2314cadd4f8SNickeau * Shared/Follow Url template 2324cadd4f8SNickeau * the endpoint template url (for sharing and following) 2334cadd4f8SNickeau * @var string $type - the type of button 2344cadd4f8SNickeau */ 2354cadd4f8SNickeau public function getWebUrlTemplate(string $type): ?string 2364cadd4f8SNickeau { 2374cadd4f8SNickeau if (isset($this->brandDict[$type])) { 2384cadd4f8SNickeau return $this->brandDict[$type]["web"]; 2394cadd4f8SNickeau } 2404cadd4f8SNickeau return null; 2414cadd4f8SNickeau } 2424cadd4f8SNickeau 2434cadd4f8SNickeau /** 2444cadd4f8SNickeau * Brand button title 2454cadd4f8SNickeau * @return string 24604fd306cSNickeau * @var ?string $type - the button type 2474cadd4f8SNickeau */ 24804fd306cSNickeau public function getTitle(string $type = null): ?string 2494cadd4f8SNickeau { 2504cadd4f8SNickeau if ($this->name === self::CURRENT_BRAND) { 2514cadd4f8SNickeau return Site::getTitle(); 2524cadd4f8SNickeau } 25304fd306cSNickeau if ($this->brandDict !== null && $type !== null) { 2544cadd4f8SNickeau if (isset($this->brandDict[$type])) { 2554cadd4f8SNickeau return $this->brandDict[$type]["popup"]; 2564cadd4f8SNickeau } 2574cadd4f8SNickeau } 2584cadd4f8SNickeau return null; 2594cadd4f8SNickeau 2604cadd4f8SNickeau } 2614cadd4f8SNickeau 2624cadd4f8SNickeau public function getPrimaryColor(): ?string 2634cadd4f8SNickeau { 2644cadd4f8SNickeau 2654cadd4f8SNickeau if ($this->brandDict !== null) { 2664cadd4f8SNickeau $primaryColor = $this->brandDict["colors"]["primary"]; 2674cadd4f8SNickeau if ($primaryColor !== null) { 2684cadd4f8SNickeau return $primaryColor; 2694cadd4f8SNickeau } 2704cadd4f8SNickeau } 2714cadd4f8SNickeau 2724cadd4f8SNickeau // Unknown or current brand / unknown color 27304fd306cSNickeau try { 27404fd306cSNickeau return ExecutionContext::getExecutionContext() 27504fd306cSNickeau ->getConfig() 27604fd306cSNickeau ->getPrimaryColor(); 27704fd306cSNickeau } catch (ExceptionNotFound $e) { 2784cadd4f8SNickeau return null; 27904fd306cSNickeau } 2804cadd4f8SNickeau 2814cadd4f8SNickeau } 2824cadd4f8SNickeau 2834cadd4f8SNickeau public function getSecondaryColor(): ?string 2844cadd4f8SNickeau { 2854cadd4f8SNickeau return $this->secondaryColor; 2864cadd4f8SNickeau } 2874cadd4f8SNickeau 2884cadd4f8SNickeau /** 28904fd306cSNickeau * @param string|null $type - the button type 2904cadd4f8SNickeau * @return string|null 2914cadd4f8SNickeau */ 29204fd306cSNickeau public function getIconName(?string $type): ?string 2934cadd4f8SNickeau { 2944cadd4f8SNickeau 2954cadd4f8SNickeau switch ($this->name) { 2964cadd4f8SNickeau case self::CURRENT_BRAND: 29704fd306cSNickeau try { 29804fd306cSNickeau return Site::getLogoAsSvgImage() 29904fd306cSNickeau ->getWikiId(); 30004fd306cSNickeau } catch (ExceptionNotFound $e) { 30104fd306cSNickeau // no logo installed 3024cadd4f8SNickeau } 3034cadd4f8SNickeau break; 3044cadd4f8SNickeau default: 3054cadd4f8SNickeau if (isset($this->brandDict["icons"])) { 3064cadd4f8SNickeau return $this->brandDict["icons"][$type]; 3074cadd4f8SNickeau } 3084cadd4f8SNickeau break; 3094cadd4f8SNickeau } 3104cadd4f8SNickeau 3114cadd4f8SNickeau return null; 3124cadd4f8SNickeau } 3134cadd4f8SNickeau 3144cadd4f8SNickeau public function getBrandUrl(): ?string 3154cadd4f8SNickeau { 3164cadd4f8SNickeau return $this->brandUrl; 3174cadd4f8SNickeau } 3184cadd4f8SNickeau 3194cadd4f8SNickeau /** 3204cadd4f8SNickeau */ 3214cadd4f8SNickeau public function supportButtonType(string $type): bool 3224cadd4f8SNickeau { 3234cadd4f8SNickeau switch ($type) { 3244cadd4f8SNickeau case BrandButton::TYPE_BUTTON_SHARE: 3254cadd4f8SNickeau case BrandButton::TYPE_BUTTON_FOLLOW: 3264cadd4f8SNickeau if ($this->getWebUrlTemplate($type) !== null) { 3274cadd4f8SNickeau return true; 3284cadd4f8SNickeau } 3294cadd4f8SNickeau return false; 3304cadd4f8SNickeau default: 3314cadd4f8SNickeau case BrandButton::TYPE_BUTTON_BRAND: 3324cadd4f8SNickeau return true; 3334cadd4f8SNickeau } 3344cadd4f8SNickeau } 3354cadd4f8SNickeau 33604fd306cSNickeau /** 33704fd306cSNickeau * @throws ExceptionNotFound 33804fd306cSNickeau */ 33904fd306cSNickeau private function getAbbr() 34004fd306cSNickeau { 341*70bbd7f1Sgerardnico $value = $this->brandDict['abbr'] ?? null; 34204fd306cSNickeau if (empty($value)) { 34304fd306cSNickeau throw new ExceptionNotFound("No abbreviations"); 34404fd306cSNickeau } 34504fd306cSNickeau return $value; 34604fd306cSNickeau } 34704fd306cSNickeau 3484cadd4f8SNickeau 3494cadd4f8SNickeau} 350