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