1*4cadd4f8SNickeau<?php 2*4cadd4f8SNickeau 3*4cadd4f8SNickeau 4*4cadd4f8SNickeaunamespace ComboStrap; 5*4cadd4f8SNickeau 6*4cadd4f8SNickeau 7*4cadd4f8SNickeauclass Brand 8*4cadd4f8SNickeau{ 9*4cadd4f8SNickeau 10*4cadd4f8SNickeau const NEWSLETTER_BRAND_NAME = "newsletter"; 11*4cadd4f8SNickeau const EMAIL_BRAND_NAME = "email"; 12*4cadd4f8SNickeau 13*4cadd4f8SNickeau public const BRAND_ABBREVIATIONS_MAPPING = [ 14*4cadd4f8SNickeau "hn" => "hackernews", 15*4cadd4f8SNickeau "mail" => "email", 16*4cadd4f8SNickeau "wp" => "wikipedia" 17*4cadd4f8SNickeau ]; 18*4cadd4f8SNickeau /** 19*4cadd4f8SNickeau * The brand of the current application/website 20*4cadd4f8SNickeau */ 21*4cadd4f8SNickeau public const CURRENT_BRAND = "current"; 22*4cadd4f8SNickeau 23*4cadd4f8SNickeau 24*4cadd4f8SNickeau private $secondaryColor; 25*4cadd4f8SNickeau private $brandUrl; 26*4cadd4f8SNickeau 27*4cadd4f8SNickeau /** 28*4cadd4f8SNickeau * @var array 29*4cadd4f8SNickeau */ 30*4cadd4f8SNickeau public static $brandDictionary; 31*4cadd4f8SNickeau /** 32*4cadd4f8SNickeau * @var bool 33*4cadd4f8SNickeau */ 34*4cadd4f8SNickeau private $unknown = false; 35*4cadd4f8SNickeau /** 36*4cadd4f8SNickeau * @var mixed 37*4cadd4f8SNickeau */ 38*4cadd4f8SNickeau private $brandDict; 39*4cadd4f8SNickeau 40*4cadd4f8SNickeau /** 41*4cadd4f8SNickeau * Brand constructor. 42*4cadd4f8SNickeau * @param string $name 43*4cadd4f8SNickeau * @throws ExceptionCombo 44*4cadd4f8SNickeau */ 45*4cadd4f8SNickeau public function __construct(string $name) 46*4cadd4f8SNickeau { 47*4cadd4f8SNickeau $this->name = strtolower($name); 48*4cadd4f8SNickeau if (isset(self::BRAND_ABBREVIATIONS_MAPPING[$this->name])) { 49*4cadd4f8SNickeau $this->name = self::BRAND_ABBREVIATIONS_MAPPING[$this->name]; 50*4cadd4f8SNickeau } 51*4cadd4f8SNickeau 52*4cadd4f8SNickeau /** 53*4cadd4f8SNickeau * Get the brands 54*4cadd4f8SNickeau */ 55*4cadd4f8SNickeau Brand::$brandDictionary = Brand::getBrandDictionary(); 56*4cadd4f8SNickeau 57*4cadd4f8SNickeau 58*4cadd4f8SNickeau /** 59*4cadd4f8SNickeau * Build the data for the brand 60*4cadd4f8SNickeau */ 61*4cadd4f8SNickeau $this->brandDict = Brand::$brandDictionary[$this->name]; 62*4cadd4f8SNickeau switch ($this->name) { 63*4cadd4f8SNickeau case self::CURRENT_BRAND: 64*4cadd4f8SNickeau $this->brandUrl = Site::getBaseUrl(); 65*4cadd4f8SNickeau $secondaryColor = Site::getSecondaryColor(); 66*4cadd4f8SNickeau if ($secondaryColor !== null) { 67*4cadd4f8SNickeau // the predicates on the secondary value is to avoid a loop with the the function below 68*4cadd4f8SNickeau $this->secondaryColor = $secondaryColor->toCssValue(); 69*4cadd4f8SNickeau } 70*4cadd4f8SNickeau break; 71*4cadd4f8SNickeau default: 72*4cadd4f8SNickeau if ($this->brandDict !== null) { 73*4cadd4f8SNickeau $this->secondaryColor = $this->brandDict["colors"]["secondary"]; 74*4cadd4f8SNickeau $this->brandUrl = $this->brandDict["url"]; 75*4cadd4f8SNickeau return; 76*4cadd4f8SNickeau } 77*4cadd4f8SNickeau $this->unknown = true; 78*4cadd4f8SNickeau break; 79*4cadd4f8SNickeau } 80*4cadd4f8SNickeau 81*4cadd4f8SNickeau } 82*4cadd4f8SNickeau 83*4cadd4f8SNickeau /** 84*4cadd4f8SNickeau * @return string[] 85*4cadd4f8SNickeau * @throws ExceptionCombo 86*4cadd4f8SNickeau */ 87*4cadd4f8SNickeau public static function getAllKnownBrandNames(): array 88*4cadd4f8SNickeau { 89*4cadd4f8SNickeau 90*4cadd4f8SNickeau $brandsDict = self::getBrandNamesFromDictionary(); 91*4cadd4f8SNickeau $brandsAbbreviations = array_keys(self::BRAND_ABBREVIATIONS_MAPPING); 92*4cadd4f8SNickeau return array_merge( 93*4cadd4f8SNickeau $brandsDict, 94*4cadd4f8SNickeau $brandsAbbreviations, 95*4cadd4f8SNickeau [self::CURRENT_BRAND] 96*4cadd4f8SNickeau ); 97*4cadd4f8SNickeau } 98*4cadd4f8SNickeau 99*4cadd4f8SNickeau /** 100*4cadd4f8SNickeau * @throws ExceptionCombo 101*4cadd4f8SNickeau */ 102*4cadd4f8SNickeau public static function getBrandNamesFromDictionary(): array 103*4cadd4f8SNickeau { 104*4cadd4f8SNickeau $brandDictionary = self::getBrandDictionary(); 105*4cadd4f8SNickeau return array_keys($brandDictionary); 106*4cadd4f8SNickeau } 107*4cadd4f8SNickeau 108*4cadd4f8SNickeau /** 109*4cadd4f8SNickeau * @throws ExceptionCombo 110*4cadd4f8SNickeau */ 111*4cadd4f8SNickeau public static function getBrandDictionary(): array 112*4cadd4f8SNickeau { 113*4cadd4f8SNickeau if (Brand::$brandDictionary === null) { 114*4cadd4f8SNickeau Brand::$brandDictionary = Dictionary::getFrom("brands"); 115*4cadd4f8SNickeau } 116*4cadd4f8SNickeau return Brand::$brandDictionary; 117*4cadd4f8SNickeau } 118*4cadd4f8SNickeau 119*4cadd4f8SNickeau 120*4cadd4f8SNickeau /** 121*4cadd4f8SNickeau * @var string 122*4cadd4f8SNickeau * The name of the brand, 123*4cadd4f8SNickeau * for company, we follow the naming of 124*4cadd4f8SNickeau * https://github.com/ellisonleao/sharer.js 125*4cadd4f8SNickeau */ 126*4cadd4f8SNickeau private $name; 127*4cadd4f8SNickeau 128*4cadd4f8SNickeau /** 129*4cadd4f8SNickeau * @throws ExceptionCombo 130*4cadd4f8SNickeau */ 131*4cadd4f8SNickeau public static function create(string $brandName): Brand 132*4cadd4f8SNickeau { 133*4cadd4f8SNickeau return new Brand($brandName); 134*4cadd4f8SNickeau } 135*4cadd4f8SNickeau 136*4cadd4f8SNickeau /** 137*4cadd4f8SNickeau * If the brand name is unknown (ie custom) 138*4cadd4f8SNickeau * @return bool 139*4cadd4f8SNickeau */ 140*4cadd4f8SNickeau public function isUnknown(): bool 141*4cadd4f8SNickeau { 142*4cadd4f8SNickeau return $this->unknown; 143*4cadd4f8SNickeau 144*4cadd4f8SNickeau } 145*4cadd4f8SNickeau 146*4cadd4f8SNickeau public function getName(): string 147*4cadd4f8SNickeau { 148*4cadd4f8SNickeau return $this->name; 149*4cadd4f8SNickeau } 150*4cadd4f8SNickeau 151*4cadd4f8SNickeau public function __toString() 152*4cadd4f8SNickeau { 153*4cadd4f8SNickeau if ($this->name === Brand::CURRENT_BRAND) { 154*4cadd4f8SNickeau return $this->name . " (" . Site::getTitle() . ")"; 155*4cadd4f8SNickeau } 156*4cadd4f8SNickeau return $this->name; 157*4cadd4f8SNickeau } 158*4cadd4f8SNickeau 159*4cadd4f8SNickeau /** 160*4cadd4f8SNickeau * Shared/Follow Url template 161*4cadd4f8SNickeau * the endpoint template url (for sharing and following) 162*4cadd4f8SNickeau * @var string $type - the type of button 163*4cadd4f8SNickeau */ 164*4cadd4f8SNickeau public function getWebUrlTemplate(string $type): ?string 165*4cadd4f8SNickeau { 166*4cadd4f8SNickeau if (isset($this->brandDict[$type])) { 167*4cadd4f8SNickeau return $this->brandDict[$type]["web"]; 168*4cadd4f8SNickeau } 169*4cadd4f8SNickeau return null; 170*4cadd4f8SNickeau } 171*4cadd4f8SNickeau 172*4cadd4f8SNickeau /** 173*4cadd4f8SNickeau * Brand button title 174*4cadd4f8SNickeau * @return string 175*4cadd4f8SNickeau * @var string $type - the button type 176*4cadd4f8SNickeau */ 177*4cadd4f8SNickeau public function getTitle(string $type): ?string 178*4cadd4f8SNickeau { 179*4cadd4f8SNickeau if ($this->name === self::CURRENT_BRAND) { 180*4cadd4f8SNickeau return Site::getTitle(); 181*4cadd4f8SNickeau } 182*4cadd4f8SNickeau if ($this->brandDict !== null) { 183*4cadd4f8SNickeau if (isset($this->brandDict[$type])) { 184*4cadd4f8SNickeau return $this->brandDict[$type]["popup"]; 185*4cadd4f8SNickeau } 186*4cadd4f8SNickeau } 187*4cadd4f8SNickeau return null; 188*4cadd4f8SNickeau 189*4cadd4f8SNickeau } 190*4cadd4f8SNickeau 191*4cadd4f8SNickeau public function getPrimaryColor(): ?string 192*4cadd4f8SNickeau { 193*4cadd4f8SNickeau 194*4cadd4f8SNickeau if ($this->brandDict !== null) { 195*4cadd4f8SNickeau $primaryColor = $this->brandDict["colors"]["primary"]; 196*4cadd4f8SNickeau if ($primaryColor !== null) { 197*4cadd4f8SNickeau return $primaryColor; 198*4cadd4f8SNickeau } 199*4cadd4f8SNickeau } 200*4cadd4f8SNickeau 201*4cadd4f8SNickeau // Unknown or current brand / unknown color 202*4cadd4f8SNickeau $primaryColor = Site::getPrimaryColor(); 203*4cadd4f8SNickeau if ($primaryColor !== null) { 204*4cadd4f8SNickeau return $primaryColor; 205*4cadd4f8SNickeau } 206*4cadd4f8SNickeau 207*4cadd4f8SNickeau return null; 208*4cadd4f8SNickeau 209*4cadd4f8SNickeau } 210*4cadd4f8SNickeau 211*4cadd4f8SNickeau public function getSecondaryColor(): ?string 212*4cadd4f8SNickeau { 213*4cadd4f8SNickeau return $this->secondaryColor; 214*4cadd4f8SNickeau } 215*4cadd4f8SNickeau 216*4cadd4f8SNickeau /** 217*4cadd4f8SNickeau * @param string $type - the button type 218*4cadd4f8SNickeau * @return string|null 219*4cadd4f8SNickeau */ 220*4cadd4f8SNickeau public function getIconName(string $type): ?string 221*4cadd4f8SNickeau { 222*4cadd4f8SNickeau 223*4cadd4f8SNickeau switch ($this->name) { 224*4cadd4f8SNickeau case self::CURRENT_BRAND: 225*4cadd4f8SNickeau $image = Site::getLogoAsSvgImage(); 226*4cadd4f8SNickeau if ($image !== null) { 227*4cadd4f8SNickeau $path = $image->getPath(); 228*4cadd4f8SNickeau if ($path instanceof DokuPath) { 229*4cadd4f8SNickeau /** 230*4cadd4f8SNickeau * End with svg, not seen as an external icon 231*4cadd4f8SNickeau */ 232*4cadd4f8SNickeau return $path->getDokuwikiId(); 233*4cadd4f8SNickeau } 234*4cadd4f8SNickeau } 235*4cadd4f8SNickeau break; 236*4cadd4f8SNickeau default: 237*4cadd4f8SNickeau if (isset($this->brandDict["icons"])) { 238*4cadd4f8SNickeau return $this->brandDict["icons"][$type]; 239*4cadd4f8SNickeau } 240*4cadd4f8SNickeau break; 241*4cadd4f8SNickeau } 242*4cadd4f8SNickeau 243*4cadd4f8SNickeau return null; 244*4cadd4f8SNickeau } 245*4cadd4f8SNickeau 246*4cadd4f8SNickeau public function getBrandUrl(): ?string 247*4cadd4f8SNickeau { 248*4cadd4f8SNickeau return $this->brandUrl; 249*4cadd4f8SNickeau } 250*4cadd4f8SNickeau 251*4cadd4f8SNickeau /** 252*4cadd4f8SNickeau */ 253*4cadd4f8SNickeau public function supportButtonType(string $type): bool 254*4cadd4f8SNickeau { 255*4cadd4f8SNickeau switch ($type) { 256*4cadd4f8SNickeau case BrandButton::TYPE_BUTTON_SHARE: 257*4cadd4f8SNickeau case BrandButton::TYPE_BUTTON_FOLLOW: 258*4cadd4f8SNickeau if ($this->getWebUrlTemplate($type) !== null) { 259*4cadd4f8SNickeau return true; 260*4cadd4f8SNickeau } 261*4cadd4f8SNickeau return false; 262*4cadd4f8SNickeau default: 263*4cadd4f8SNickeau case BrandButton::TYPE_BUTTON_BRAND: 264*4cadd4f8SNickeau return true; 265*4cadd4f8SNickeau } 266*4cadd4f8SNickeau } 267*4cadd4f8SNickeau 268*4cadd4f8SNickeau 269*4cadd4f8SNickeau} 270