xref: /plugin/combo/ComboStrap/TagAttribute/StyleAttribute.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau/**
3*04fd306cSNickeau * Copyright (c) 2020. ComboStrap, Inc. and its affiliates. All Rights Reserved.
4*04fd306cSNickeau *
5*04fd306cSNickeau * This source code is licensed under the GPL license found in the
6*04fd306cSNickeau * COPYING  file in the root directory of this source tree.
7*04fd306cSNickeau *
8*04fd306cSNickeau * @license  GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html)
9*04fd306cSNickeau * @author   ComboStrap <support@combostrap.com>
10*04fd306cSNickeau *
11*04fd306cSNickeau */
12*04fd306cSNickeau
13*04fd306cSNickeaunamespace ComboStrap\TagAttribute;
14*04fd306cSNickeau
15*04fd306cSNickeau
16*04fd306cSNickeauuse ComboStrap\ExceptionNotEquals;
17*04fd306cSNickeauuse ComboStrap\StringUtility;
18*04fd306cSNickeauuse ComboStrap\TagAttributes;
19*04fd306cSNickeau
20*04fd306cSNickeau/**
21*04fd306cSNickeau * This class gots static function about the HTML style attribute
22*04fd306cSNickeau *
23*04fd306cSNickeau * The style attribute is not allowed due to security concern
24*04fd306cSNickeau * in Combostrap (Click Hijacking, ...)
25*04fd306cSNickeau */
26*04fd306cSNickeauclass StyleAttribute
27*04fd306cSNickeau{
28*04fd306cSNickeau
29*04fd306cSNickeau    const COMBOSTRAP_FIX = "cs";
30*04fd306cSNickeau    public const STYLE_ATTRIBUTE = "style";
31*04fd306cSNickeau
32*04fd306cSNickeau    public static function getRule(array $styles, $selector): string
33*04fd306cSNickeau    {
34*04fd306cSNickeau        $rule = $selector . " {" . DOKU_LF;
35*04fd306cSNickeau        foreach ($styles as $key => $value) {
36*04fd306cSNickeau            $rule .= "    $key:$value;" . DOKU_LF;
37*04fd306cSNickeau        }
38*04fd306cSNickeau        StringUtility::rtrim($rule, ";");
39*04fd306cSNickeau        return $rule . DOKU_LF . "}" . DOKU_LF;
40*04fd306cSNickeau
41*04fd306cSNickeau    }
42*04fd306cSNickeau
43*04fd306cSNickeau    /**
44*04fd306cSNickeau     * @param array $array of property as key and value
45*04fd306cSNickeau     * @return string a html inline style property
46*04fd306cSNickeau     */
47*04fd306cSNickeau    public static function createInlineValue(array $array)
48*04fd306cSNickeau    {
49*04fd306cSNickeau        $inline = "";
50*04fd306cSNickeau        foreach ($array as $property => $value) {
51*04fd306cSNickeau            if ($inline != "") {
52*04fd306cSNickeau                $inline .= ";$property:$value";
53*04fd306cSNickeau            } else {
54*04fd306cSNickeau                $inline = "$property:$value";
55*04fd306cSNickeau            }
56*04fd306cSNickeau        }
57*04fd306cSNickeau        return $inline;
58*04fd306cSNickeau
59*04fd306cSNickeau    }
60*04fd306cSNickeau
61*04fd306cSNickeau    /**
62*04fd306cSNickeau     * Add class for user styling
63*04fd306cSNickeau     * See
64*04fd306cSNickeau     * https://combostrap.com/styling/userstyle#class
65*04fd306cSNickeau     * @param TagAttributes $tagAttributes
66*04fd306cSNickeau     */
67*04fd306cSNickeau    public static function addStylingClass(TagAttributes &$tagAttributes)
68*04fd306cSNickeau    {
69*04fd306cSNickeau        $logicalTag = $tagAttributes->getLogicalTag();
70*04fd306cSNickeau        if ($logicalTag !== null && $tagAttributes->getDefaultStyleClassShouldBeAdded() === true) {
71*04fd306cSNickeau
72*04fd306cSNickeau            $tagAttributes->addClassName(self::addComboStrapSuffix($logicalTag));
73*04fd306cSNickeau            if (!empty($tagAttributes->getType())) {
74*04fd306cSNickeau                $tagAttributes->addClassName($logicalTag . "-" . $tagAttributes->getType() . "-" . self::COMBOSTRAP_FIX);
75*04fd306cSNickeau            }
76*04fd306cSNickeau        }
77*04fd306cSNickeau    }
78*04fd306cSNickeau
79*04fd306cSNickeau    public static function addComboStrapSuffix($name): string
80*04fd306cSNickeau    {
81*04fd306cSNickeau        return $name . "-" . self::COMBOSTRAP_FIX;
82*04fd306cSNickeau    }
83*04fd306cSNickeau
84*04fd306cSNickeau    public static function HtmlStyleValueToArray(string $htmlStyleValue): array
85*04fd306cSNickeau    {
86*04fd306cSNickeau        $stylingDeclarationsAsString = explode(";", $htmlStyleValue);
87*04fd306cSNickeau        $stylingDeclarationAsArray = [];
88*04fd306cSNickeau        foreach ($stylingDeclarationsAsString as $stylingDeclaration) {
89*04fd306cSNickeau            if (empty($stylingDeclaration)) {
90*04fd306cSNickeau                // case with a trailing comma. ie `width:18rem;`
91*04fd306cSNickeau                continue;
92*04fd306cSNickeau            }
93*04fd306cSNickeau            [$key, $value] = preg_split("/:/", $stylingDeclaration, 2);
94*04fd306cSNickeau            $stylingDeclarationAsArray[$key] = $value;
95*04fd306cSNickeau        }
96*04fd306cSNickeau        return $stylingDeclarationAsArray;
97*04fd306cSNickeau
98*04fd306cSNickeau    }
99*04fd306cSNickeau
100*04fd306cSNickeau    /**
101*04fd306cSNickeau     * @throws ExceptionNotEquals
102*04fd306cSNickeau     */
103*04fd306cSNickeau    public static function arrayEquals(array $expectedQuery, array $actualQuery)
104*04fd306cSNickeau    {
105*04fd306cSNickeau        foreach ($actualQuery as $key => $value) {
106*04fd306cSNickeau            $expectedValue = $expectedQuery[$key];
107*04fd306cSNickeau            if ($expectedValue === null) {
108*04fd306cSNickeau                throw new ExceptionNotEquals("The expected style does not have the $key property");
109*04fd306cSNickeau            }
110*04fd306cSNickeau            if ($expectedValue !== $value) {
111*04fd306cSNickeau                throw new ExceptionNotEquals("The style $key property does not have the same value ($value vs $expectedValue)");
112*04fd306cSNickeau            }
113*04fd306cSNickeau            unset($expectedQuery[$key]);
114*04fd306cSNickeau        }
115*04fd306cSNickeau        foreach ($expectedQuery as $key => $value) {
116*04fd306cSNickeau            throw new ExceptionNotEquals("The expected styles has an extra property ($key=$value)");
117*04fd306cSNickeau        }
118*04fd306cSNickeau    }
119*04fd306cSNickeau
120*04fd306cSNickeau    /**
121*04fd306cSNickeau     * @throws ExceptionNotEquals
122*04fd306cSNickeau     */
123*04fd306cSNickeau    public static function stringEquals($leftStyles, $rightStyles)
124*04fd306cSNickeau    {
125*04fd306cSNickeau        $leftStylesArray = StyleAttribute::HtmlStyleValueToArray($leftStyles);
126*04fd306cSNickeau        $rightStylesArray = StyleAttribute::HtmlStyleValueToArray($rightStyles);
127*04fd306cSNickeau        self::arrayEquals($leftStylesArray,$rightStylesArray);
128*04fd306cSNickeau    }
129*04fd306cSNickeau}
130