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 13*04fd306cSNickeau 144cadd4f8SNickeau /** 154cadd4f8SNickeau * The brand of the current application/website 164cadd4f8SNickeau */ 174cadd4f8SNickeau public const CURRENT_BRAND = "current"; 18*04fd306cSNickeau const CANONICAL = "brand"; 19*04fd306cSNickeau const ABBR_PROPERTY = 'abbr'; 20*04fd306cSNickeau /** 21*04fd306cSNickeau * @var array an array of brand abbreviation as key and their name as value 22*04fd306cSNickeau */ 23*04fd306cSNickeau private static array $BRAND_ABBR; 244cadd4f8SNickeau 254cadd4f8SNickeau 264cadd4f8SNickeau private $secondaryColor; 274cadd4f8SNickeau private $brandUrl; 284cadd4f8SNickeau 294cadd4f8SNickeau /** 304cadd4f8SNickeau * @var array 314cadd4f8SNickeau */ 32*04fd306cSNickeau public static array $brandDictionary; 334cadd4f8SNickeau /** 344cadd4f8SNickeau * @var bool 354cadd4f8SNickeau */ 36*04fd306cSNickeau private bool $unknown = false; 374cadd4f8SNickeau /** 384cadd4f8SNickeau * @var mixed 394cadd4f8SNickeau */ 404cadd4f8SNickeau private $brandDict; 414cadd4f8SNickeau 42*04fd306cSNickeau 434cadd4f8SNickeau /** 444cadd4f8SNickeau * Brand constructor. 454cadd4f8SNickeau * @param string $name 464cadd4f8SNickeau */ 47*04fd306cSNickeau private function __construct(string $name) 484cadd4f8SNickeau { 49*04fd306cSNickeau 50*04fd306cSNickeau $this->name = $name; 514cadd4f8SNickeau 524cadd4f8SNickeau /** 534cadd4f8SNickeau * Get the brands 544cadd4f8SNickeau */ 55*04fd306cSNickeau $brandDictionary = Brand::getBrandDictionary(); 564cadd4f8SNickeau 574cadd4f8SNickeau 584cadd4f8SNickeau /** 594cadd4f8SNickeau * Build the data for the brand 604cadd4f8SNickeau */ 61*04fd306cSNickeau $this->brandDict = $brandDictionary[$this->name]; 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) { 734cadd4f8SNickeau $this->secondaryColor = $this->brandDict["colors"]["secondary"]; 744cadd4f8SNickeau $this->brandUrl = $this->brandDict["url"]; 754cadd4f8SNickeau return; 764cadd4f8SNickeau } 774cadd4f8SNickeau $this->unknown = true; 784cadd4f8SNickeau break; 794cadd4f8SNickeau } 804cadd4f8SNickeau 814cadd4f8SNickeau } 824cadd4f8SNickeau 834cadd4f8SNickeau /** 844cadd4f8SNickeau * @return string[] 854cadd4f8SNickeau */ 864cadd4f8SNickeau public static function getAllKnownBrandNames(): array 874cadd4f8SNickeau { 884cadd4f8SNickeau 89*04fd306cSNickeau $brands = self::getAllBrands(); 90*04fd306cSNickeau $brandNames = [self::CURRENT_BRAND]; 91*04fd306cSNickeau foreach ($brands as $brand) { 92*04fd306cSNickeau $brandNames[] = $brand->getName(); 93*04fd306cSNickeau try { 94*04fd306cSNickeau $brandNames[] = $brand->getAbbr(); 95*04fd306cSNickeau } catch (ExceptionNotFound $e) { 96*04fd306cSNickeau // ok 97*04fd306cSNickeau } 98*04fd306cSNickeau } 99*04fd306cSNickeau return $brandNames; 100*04fd306cSNickeau 1014cadd4f8SNickeau } 1024cadd4f8SNickeau 103*04fd306cSNickeau 1044cadd4f8SNickeau /** 105*04fd306cSNickeau * @return Brand[] 1064cadd4f8SNickeau */ 107*04fd306cSNickeau public static function getAllBrands(): array 1084cadd4f8SNickeau { 1094cadd4f8SNickeau $brandDictionary = self::getBrandDictionary(); 110*04fd306cSNickeau $brands = []; 111*04fd306cSNickeau foreach (array_keys($brandDictionary) as $brandName) { 112*04fd306cSNickeau $brands[] = self::create($brandName); 113*04fd306cSNickeau } 114*04fd306cSNickeau return $brands; 1154cadd4f8SNickeau } 1164cadd4f8SNickeau 1174cadd4f8SNickeau /** 118*04fd306cSNickeau * @param $type - the button type (ie one of {@link BrandButton::TYPE_BUTTONS} 119*04fd306cSNickeau * @return array - the brand names that can be used as type in the brand button 120*04fd306cSNickeau */ 121*04fd306cSNickeau public static function getBrandNamesForButtonType($type): array 122*04fd306cSNickeau { 123*04fd306cSNickeau $brands = self::getAllBrands(); 124*04fd306cSNickeau $brandNamesForType = []; 125*04fd306cSNickeau foreach ($brands as $brand) { 126*04fd306cSNickeau if ($brand->supportButtonType($type)) { 127*04fd306cSNickeau $brandNamesForType[] = $brand->getName(); 128*04fd306cSNickeau try { 129*04fd306cSNickeau $brandNamesForType[] = $brand->getAbbr(); 130*04fd306cSNickeau } catch (ExceptionNotFound $e) { 131*04fd306cSNickeau // ok 132*04fd306cSNickeau } 133*04fd306cSNickeau } 134*04fd306cSNickeau } 135*04fd306cSNickeau return $brandNamesForType; 136*04fd306cSNickeau } 137*04fd306cSNickeau 138*04fd306cSNickeau /** 139*04fd306cSNickeau * 1404cadd4f8SNickeau */ 1414cadd4f8SNickeau public static function getBrandDictionary(): array 1424cadd4f8SNickeau { 143*04fd306cSNickeau if (!isset(Brand::$brandDictionary)) { 144*04fd306cSNickeau try { 1454cadd4f8SNickeau Brand::$brandDictionary = Dictionary::getFrom("brands"); 146*04fd306cSNickeau } catch (ExceptionCompile $e) { 147*04fd306cSNickeau // Should never happens 148*04fd306cSNickeau Brand::$brandDictionary = []; 149*04fd306cSNickeau LogUtility::error("We can't load the brands dictionary. Error: " . $e->getMessage(), self::CANONICAL, $e); 150*04fd306cSNickeau } 1514cadd4f8SNickeau } 1524cadd4f8SNickeau return Brand::$brandDictionary; 1534cadd4f8SNickeau } 1544cadd4f8SNickeau 1554cadd4f8SNickeau 1564cadd4f8SNickeau /** 1574cadd4f8SNickeau * @var string 1584cadd4f8SNickeau * The name of the brand, 1594cadd4f8SNickeau * for company, we follow the naming of 1604cadd4f8SNickeau * https://github.com/ellisonleao/sharer.js 1614cadd4f8SNickeau */ 1624cadd4f8SNickeau private $name; 1634cadd4f8SNickeau 164*04fd306cSNickeau 1654cadd4f8SNickeau public static function create(string $brandName): Brand 1664cadd4f8SNickeau { 167*04fd306cSNickeau 168*04fd306cSNickeau $brandNameQualified = strtolower($brandName); 169*04fd306cSNickeau $brandNameQualified = Brand::getBrandNameFromAbbr($brandNameQualified); 170*04fd306cSNickeau $objectIdentifier = self::CANONICAL . "-" . $brandNameQualified; 171*04fd306cSNickeau $executionContext = ExecutionContext::getActualOrCreateFromEnv(); 172*04fd306cSNickeau try { 173*04fd306cSNickeau return $executionContext->getRuntimeObject($objectIdentifier); 174*04fd306cSNickeau } catch (ExceptionNotFound $e) { 175*04fd306cSNickeau $brandObject = new Brand($brandNameQualified); 176*04fd306cSNickeau $executionContext->setRuntimeObject($objectIdentifier, $brandObject); 177*04fd306cSNickeau return $brandObject; 1784cadd4f8SNickeau } 1794cadd4f8SNickeau 180*04fd306cSNickeau } 181*04fd306cSNickeau 182*04fd306cSNickeau private static function getBrandNameFromAbbr(string $name) 183*04fd306cSNickeau { 184*04fd306cSNickeau if (!isset(self::$BRAND_ABBR)) { 185*04fd306cSNickeau $brandDictionary = self::getBrandDictionary(); 186*04fd306cSNickeau foreach ($brandDictionary as $brandName => $brandProperties) { 187*04fd306cSNickeau $abbr = $brandProperties[self::ABBR_PROPERTY]; 188*04fd306cSNickeau if (empty($abbr)) { 189*04fd306cSNickeau continue; 190*04fd306cSNickeau } 191*04fd306cSNickeau self::$BRAND_ABBR[$abbr] = $brandName; 192*04fd306cSNickeau } 193*04fd306cSNickeau } 194*04fd306cSNickeau if (isset(self::$BRAND_ABBR[$name])) { 195*04fd306cSNickeau return self::$BRAND_ABBR[$name]; 196*04fd306cSNickeau } 197*04fd306cSNickeau return $name; 198*04fd306cSNickeau 199*04fd306cSNickeau } 200*04fd306cSNickeau 201*04fd306cSNickeau 2024cadd4f8SNickeau /** 2034cadd4f8SNickeau * If the brand name is unknown (ie custom) 2044cadd4f8SNickeau * @return bool 2054cadd4f8SNickeau */ 2064cadd4f8SNickeau public function isUnknown(): bool 2074cadd4f8SNickeau { 2084cadd4f8SNickeau return $this->unknown; 2094cadd4f8SNickeau 2104cadd4f8SNickeau } 2114cadd4f8SNickeau 2124cadd4f8SNickeau public function getName(): string 2134cadd4f8SNickeau { 2144cadd4f8SNickeau return $this->name; 2154cadd4f8SNickeau } 2164cadd4f8SNickeau 2174cadd4f8SNickeau public function __toString() 2184cadd4f8SNickeau { 2194cadd4f8SNickeau if ($this->name === Brand::CURRENT_BRAND) { 2204cadd4f8SNickeau return $this->name . " (" . Site::getTitle() . ")"; 2214cadd4f8SNickeau } 2224cadd4f8SNickeau return $this->name; 2234cadd4f8SNickeau } 2244cadd4f8SNickeau 2254cadd4f8SNickeau /** 2264cadd4f8SNickeau * Shared/Follow Url template 2274cadd4f8SNickeau * the endpoint template url (for sharing and following) 2284cadd4f8SNickeau * @var string $type - the type of button 2294cadd4f8SNickeau */ 2304cadd4f8SNickeau public function getWebUrlTemplate(string $type): ?string 2314cadd4f8SNickeau { 2324cadd4f8SNickeau if (isset($this->brandDict[$type])) { 2334cadd4f8SNickeau return $this->brandDict[$type]["web"]; 2344cadd4f8SNickeau } 2354cadd4f8SNickeau return null; 2364cadd4f8SNickeau } 2374cadd4f8SNickeau 2384cadd4f8SNickeau /** 2394cadd4f8SNickeau * Brand button title 2404cadd4f8SNickeau * @return string 241*04fd306cSNickeau * @var ?string $type - the button type 2424cadd4f8SNickeau */ 243*04fd306cSNickeau public function getTitle(string $type = null): ?string 2444cadd4f8SNickeau { 2454cadd4f8SNickeau if ($this->name === self::CURRENT_BRAND) { 2464cadd4f8SNickeau return Site::getTitle(); 2474cadd4f8SNickeau } 248*04fd306cSNickeau if ($this->brandDict !== null && $type !== null) { 2494cadd4f8SNickeau if (isset($this->brandDict[$type])) { 2504cadd4f8SNickeau return $this->brandDict[$type]["popup"]; 2514cadd4f8SNickeau } 2524cadd4f8SNickeau } 2534cadd4f8SNickeau return null; 2544cadd4f8SNickeau 2554cadd4f8SNickeau } 2564cadd4f8SNickeau 2574cadd4f8SNickeau public function getPrimaryColor(): ?string 2584cadd4f8SNickeau { 2594cadd4f8SNickeau 2604cadd4f8SNickeau if ($this->brandDict !== null) { 2614cadd4f8SNickeau $primaryColor = $this->brandDict["colors"]["primary"]; 2624cadd4f8SNickeau if ($primaryColor !== null) { 2634cadd4f8SNickeau return $primaryColor; 2644cadd4f8SNickeau } 2654cadd4f8SNickeau } 2664cadd4f8SNickeau 2674cadd4f8SNickeau // Unknown or current brand / unknown color 268*04fd306cSNickeau try { 269*04fd306cSNickeau return ExecutionContext::getExecutionContext() 270*04fd306cSNickeau ->getConfig() 271*04fd306cSNickeau ->getPrimaryColor(); 272*04fd306cSNickeau } catch (ExceptionNotFound $e) { 2734cadd4f8SNickeau return null; 274*04fd306cSNickeau } 2754cadd4f8SNickeau 2764cadd4f8SNickeau } 2774cadd4f8SNickeau 2784cadd4f8SNickeau public function getSecondaryColor(): ?string 2794cadd4f8SNickeau { 2804cadd4f8SNickeau return $this->secondaryColor; 2814cadd4f8SNickeau } 2824cadd4f8SNickeau 2834cadd4f8SNickeau /** 284*04fd306cSNickeau * @param string|null $type - the button type 2854cadd4f8SNickeau * @return string|null 2864cadd4f8SNickeau */ 287*04fd306cSNickeau public function getIconName(?string $type): ?string 2884cadd4f8SNickeau { 2894cadd4f8SNickeau 2904cadd4f8SNickeau switch ($this->name) { 2914cadd4f8SNickeau case self::CURRENT_BRAND: 292*04fd306cSNickeau try { 293*04fd306cSNickeau return Site::getLogoAsSvgImage() 294*04fd306cSNickeau ->getWikiId(); 295*04fd306cSNickeau } catch (ExceptionNotFound $e) { 296*04fd306cSNickeau // no logo installed 2974cadd4f8SNickeau } 2984cadd4f8SNickeau break; 2994cadd4f8SNickeau default: 3004cadd4f8SNickeau if (isset($this->brandDict["icons"])) { 3014cadd4f8SNickeau return $this->brandDict["icons"][$type]; 3024cadd4f8SNickeau } 3034cadd4f8SNickeau break; 3044cadd4f8SNickeau } 3054cadd4f8SNickeau 3064cadd4f8SNickeau return null; 3074cadd4f8SNickeau } 3084cadd4f8SNickeau 3094cadd4f8SNickeau public function getBrandUrl(): ?string 3104cadd4f8SNickeau { 3114cadd4f8SNickeau return $this->brandUrl; 3124cadd4f8SNickeau } 3134cadd4f8SNickeau 3144cadd4f8SNickeau /** 3154cadd4f8SNickeau */ 3164cadd4f8SNickeau public function supportButtonType(string $type): bool 3174cadd4f8SNickeau { 3184cadd4f8SNickeau switch ($type) { 3194cadd4f8SNickeau case BrandButton::TYPE_BUTTON_SHARE: 3204cadd4f8SNickeau case BrandButton::TYPE_BUTTON_FOLLOW: 3214cadd4f8SNickeau if ($this->getWebUrlTemplate($type) !== null) { 3224cadd4f8SNickeau return true; 3234cadd4f8SNickeau } 3244cadd4f8SNickeau return false; 3254cadd4f8SNickeau default: 3264cadd4f8SNickeau case BrandButton::TYPE_BUTTON_BRAND: 3274cadd4f8SNickeau return true; 3284cadd4f8SNickeau } 3294cadd4f8SNickeau } 3304cadd4f8SNickeau 331*04fd306cSNickeau /** 332*04fd306cSNickeau * @throws ExceptionNotFound 333*04fd306cSNickeau */ 334*04fd306cSNickeau private function getAbbr() 335*04fd306cSNickeau { 336*04fd306cSNickeau $value = $this->brandDict['abbr']; 337*04fd306cSNickeau if (empty($value)) { 338*04fd306cSNickeau throw new ExceptionNotFound("No abbreviations"); 339*04fd306cSNickeau } 340*04fd306cSNickeau return $value; 341*04fd306cSNickeau } 342*04fd306cSNickeau 3434cadd4f8SNickeau 3444cadd4f8SNickeau} 345