xref: /template/strap/ComboStrap/Brand.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
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